日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于casbin的ABAC/RBAC权限实践

發(fā)布時間:2024/3/12 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于casbin的ABAC/RBAC权限实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


五一假期疫情封在家也沒事做,就想來優(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)限)

///?<summary> ///?創(chuàng)建casbin模型 ///?</summary> ///?<returns></returns> public?static?Enforcer?createEnforcer() {var?e?=?new?Enforcer();var?m?=?NetCasbin.Model.Model.CreateDefault();m.AddDef("r",?"r",?"sub,?obj,?act");m.AddDef("p",?"p",?"sub,?obj,?act");m.AddDef("e",?"e",?"some(where?(p.eft?==?allow))");m.AddDef("m",?"m",?"r.sub?==?p.sub?&&?keyMatch(r.obj,?p.obj)?&&?regexMatch(r.act,?p.act)?||?r.sub?==?"root"");var?csv?=?Path.Combine(WebRootPath,?CasBinPolicyFile);if?(!File.Exists(csv)){File.CreateText(csv);}e.SetModel(m);//?目前我的權(quán)限配置文件是放在csv文件中?切換成存db的話?就切換一個adaptere.SetAdapter(new?DefaultFileAdapter(csv));e.LoadPolicy();return?e; }

由于本身我的這個項目是一個中間件,


//內(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方法進行驗證

bool?isAuthed?=?ef.Enforce(sub,?obj,?act);

設(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。