一.基礎概念
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
參考文檔: