基于casbin的ABAC/RBAC权限实践
五一假期疫情封在家也沒事做,就想來優(yōu)化一下一個(gè)前端容器小項(xiàng)目
之前的TODOlist里面有一項(xiàng)是權(quán)限這塊時(shí)隔2年了還一直沒有動(dòng)手
遲遲沒搞主要還是我太懶了,哈哈 其實(shí)我一直想要找一個(gè)輕量級(jí)的權(quán)限通用方案
- 權(quán)限的數(shù)據(jù)源可以切換,但是邏輯基本不用動(dòng) 
- 權(quán)限策略定義簡(jiǎn)單不復(fù)雜,支持RBAC,ABAC(粒度可粗可細(xì)) 
- 支持內(nèi)置超級(jí)用戶(上帝模式) 
知道我最近研究了一下casbin(基于各種訪問控制模型的授權(quán)), 發(fā)現(xiàn)它正好滿足了我以上幾個(gè)點(diǎn)官網(wǎng):https://casbin.org/
基于cashbin的權(quán)限實(shí)踐
1. 權(quán)限設(shè)計(jì)
分為2種權(quán)限:超級(jí)管理員(上帝模式) 和 普通用戶
我這個(gè)程序的功能是按照項(xiàng)目維度來區(qū)分的,超級(jí)管理員創(chuàng)建一個(gè)空項(xiàng)目后,授權(quán)給別人去維護(hù),總共包含7大功能:
超級(jí)管理員可以訪問所有功能, 但只能是【超級(jí)管理員】做的有1和2和3
- 1.權(quán)限配置(普通用戶創(chuàng)建和刪除,權(quán)限的修改和保存) 
- 2.全局配置 
- 3.創(chuàng)建空項(xiàng)目 
- 4.上傳并部署該項(xiàng)目 
- 5.把項(xiàng)目回滾到上一個(gè)版本 
- 6.項(xiàng)目維度的服務(wù)端js腳本(讀和寫) 
- 7.項(xiàng)目維度的配置文件(讀和寫) 
普通用戶則可以被超級(jí)管理員在權(quán)限配置頁面創(chuàng)建并進(jìn)行配置來限制是否授予訪問4~7這幾個(gè)功能
2. 代碼開發(fā)
casbin基本主流的開發(fā)語言都有對(duì)應(yīng)的實(shí)現(xiàn),這里我用netcore版本(Casbin.NET)
首先定義模型:
[request_definition] r?=?sub,?obj,?act[policy_definition] p?=?sub,?obj,?act[policy_effect] e?=?some(where?(p.eft?==?allow))[matchers] r.sub?==?p.sub?&&?keyMatch(r.obj,?p.obj)?&&?regexMatch(r.act,?p.act)?||?r.sub?==?"root"由于我這個(gè)是按照project進(jìn)行權(quán)限控制的,所以我選用的是這個(gè)模型
- sub -> user(登錄用戶名,root是超級(jí)用戶/上帝模式) 
- obj -> project(項(xiàng)目) 
- act -> api資源(這里用了基于正則的方式為了應(yīng)對(duì)配置一個(gè)用戶可以訪問project下所有權(quán)限) 
由于本身我的這個(gè)項(xiàng)目是一個(gè)中間件,
//內(nèi)部api app.UseWhen(c?=>{//?檢查路由是否滿足要求if?(!ApiMiddleware.CanInvoke(c,?out?var?route)){return?false;}//?路由規(guī)則滿足后檢查api是否存在return?c.RequestServices.GetService<SpaDomain>()?.IsSpaApi(route.Item2)????false;},_?=>?_.UseMiddleware<ApiMiddleware>());
對(duì)于普通用戶可訪問的內(nèi)部的api訪問路徑進(jìn)行規(guī)則約束
- 4.上傳并部署該項(xiàng)目-> /{project}.reupload 
- 5.把項(xiàng)目回滾到上一個(gè)版本 -> ?/{project}.rollback 
- 6.項(xiàng)目維度的服務(wù)端js腳本(讀) -> ?/{project}.getconfigjson 
- 項(xiàng)目維度的服務(wù)端js腳本(寫) -> ?/{project}.saveconfigjson 
- 7.項(xiàng)目維度的配置文件(讀) -> ?/{project}.serverjsget 
- 項(xiàng)目維度的配置文件(寫)-> ?/{project}.serverjssave 
這樣我在ApiMiddleware里面可以進(jìn)行統(tǒng)一權(quán)限攔截處理了
- 解析請(qǐng)求路徑 拿到 project(obj) 和 act (api) 
- 拿到當(dāng)前登錄 拿到 sub(user) 
- 拿到了sub,obj,act三要素后調(diào)用casbin方法進(jìn)行驗(yàn)證 
設(shè)計(jì)一個(gè)頁面來配置策略
這也是針對(duì)casbin的一個(gè)ui操作的封裝
- 支持創(chuàng)建用戶 
- casbin的策略進(jìn)行增刪改查 
- 支持的api資源的列表展示 
那么通過這個(gè)ui操作就很容易去配置
粗粒度:某個(gè)用戶對(duì)哪些project有權(quán)限
image如上圖,資源路徑我配置了/* 代表這個(gè)zdyu用戶可以訪問project:test的所有操作
細(xì)力度:某個(gè)用戶對(duì)哪些project的哪些具體操作有權(quán)限
image如上圖,代表zdyu這個(gè)用戶只能訪問test這個(gè)project下的 部署和回滾2個(gè)功能
總結(jié)
本身研究怎么用casbin是非常簡(jiǎn)單的,這里主要分享了結(jié)合具體項(xiàng)目來如何設(shè)計(jì),細(xì)節(jié)源碼可以查看
https://github.com/yuzd/Spa
spa單頁面容器里面一個(gè)project相當(dāng)于一個(gè)二級(jí)域名的應(yīng)用,應(yīng)用內(nèi)互相隔離,可以代替部署nginx或apache,對(duì)前端開發(fā)者友好,適合在某些只是用來靜態(tài)項(xiàng)目訪問的場(chǎng)景,來提高效率!
權(quán)限這塊使用casbin很輕量級(jí),目前只保存在本地文件中,將來如果換成db也只是換一個(gè)adapter不用改邏輯非常方便。
我是正東,學(xué)的越多不知道也越多。一起追求高效率編程~
總結(jié)
以上是生活随笔為你收集整理的基于casbin的ABAC/RBAC权限实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 计算机应届生有没有必要参加IT培训?
- 下一篇: tplink720n变无线打印服务器,T
