微服務-角色權限設計(Casbin)(3-2)


一.基礎概念
Casbin是一個強大的,高效的開源訪問控制框架,權限管理機制支持多種訪問控制模型
在項目中通過Oauth2,OpenID進行身份認證,即驗證用戶的用戶名和密碼。再做訪問控制,權限約束時,引入casbin來實現,其思想是存儲RBAC方案中的用戶和角色之間的映射關系,同時還適用於ABAC的規則,便於以后的擴展。
 
RBAC(Role-Based Access Control)
提煉出角色的概念,從而實現靈活的權限管理。表結構大致是用戶關聯角色,角色關聯權限的設計
其中RBAC又分為RBAC0,RBAC1(角色繼承),RBAC2(角色約束),RBAC3(RBAC1+RBAC2)
 
ABAC(Attribute-Based Access Control)
不同於將用戶和權限做關聯,ABAC是通過動態計算一個或一組屬性來滿足某種條件進行授權判斷。大致分為四種屬性:用戶屬性,環境屬性,操作屬性,對象屬性(資源屬性),搭配組合更加靈活
 
二.工作原理
Casbin的工作原理:基於PERM模式,通過策略規則和資源進行匹配。原理大致如下:

 

 

 
三.實踐
(1)新建控制台程序CasbinNet
引入Nuget包:Casbin.NET ,Casbin.NET.Adapter.EFCore
(2)添加rbac_model.conf規則
# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act, eft # 這里我們定義了eft,不使用默認值

# Policy effect
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) # 這里使用了deny優先

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act #最簡單的匹配規則。請求的參數與策略參數一致時獲得策略結果
(3)核心代碼:
 1  var options = new DbContextOptionsBuilder<CasbinDbContext<int>>()
 2                 .UseSqlite("Data Source=casbin_example.sqlite3")
 3                 //.UseNpgsql("User ID=postgres;Password=123456;Host=127.0.0.1;Port=5432;Database=Craftica;Pooling=true;")
 4                 .Options;
 5             var context = new CasbinDbContext<int>(options);
 6 
 7             // If it doesn't exist, you can use this to create it automatically.
 8             //context.Database.EnsureCreated();
 9 
10             // Initialize a EF Core adapter and use it in a Casbin enforcer:
11             var efCoreAdapter = new EFCoreAdapter<int>(context);
12             var e = new Enforcer("examples/rbac_model.conf", efCoreAdapter);
13 
14             // Load the policy from DB.
15             e.LoadPolicy();
16 
17             // Check the permission.
18             bool aaa= e.Enforce("alice", "data1", "read");

示例中使用UseSqlite, 初次運行會在數據庫中自動生成表casbin_rule。

 

 

字段V0-V5名稱可以暫時不用管,第四步會具體進行修改
在Sqlite中配置角色資源信息,如下圖所示:
其中Enforcer通過rbac_model.conf和資源文件列表匹配數據,再和request模型進行匹配,如果返回true,表示成功,反之則沒有權限
 
以alice,data1,read為例:
 
四.Adapter 適配器優化
不用casbin提供的Nuget包 Casbin.NET.Adapter.EFCore
如下圖所示:
自定義Adapter和表實體Model模型,其中CasbinDbAdapter要繼承接口IAdapter的一些策略的增刪改查的方法
核心是實現加載策略的方法LoadPolicy,要有數據列表加載:
在實際開發中,為了加載數據的提升,建議放在Redis中維護
其他使用規則和步驟三大致相似,附中提供參考源碼
 
以上僅用於學習和總結!
 
附:
步驟3源碼:
鏈接:https://pan.baidu.com/s/1ivvDfolFzImwERSzfY4QgQ
提取碼:s3v4
 
步驟4源碼:
鏈接:https://pan.baidu.com/s/1e25OYt5R6BMsh3TW8UjCDg
提取碼:xq3m
 
參考文檔:
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM