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