Casbin 是什么?
官方解釋:Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型。
Casbin只負責訪問控制。身份認證 authentication(即驗證用戶的用戶名、密碼),需要其他專門的身份認證組件負責。例如(jwt-go)
兩個核心概念:
訪問控制模型model和策略policy。
工作原理:
Casbin把 訪問控制模型 被抽象為基於
PERM元模型 (Policy, Effect, Request, Matchers) [策略,效果,請求,匹配器]
PERM(Policy, Effect, Request, Matchers)模型很簡單, 但是反映了權限的本質 – 訪問控制
- Policy: 定義權限的規則
- Effect: 定義組合了多個 Policy 之后的結果, allow/deny
- Request: 訪問請求, 也就是誰想操作什么
- Matcher: 判斷 Request 是否滿足 Policy
匹配來源:定義的 request 和 存儲的 police 比對判斷。
所有 model file 中主要就是定義 PERM 4 個部分。
的一個文件( model.conf , 這個文件一般是固定的)。 因此,切換或升級項目的授權機制與修改配置一樣簡單。 您可以通過組合可用的模型來定制您自己的訪問控制模型(ACL, RBAC, ABAC)。 例如,您可以在一個model中獲得RBAC角色和ABAC屬性,並共享一組policy規則。
Casbin中最基本、最簡單的model是ACL。ACL中的model CONF為:
# Request definition [request_definition] 自定義請求的格式 r = sub, obj, act # Policy definition [policy_definition] 策略定義 p = sub, obj, act # Policy effect [policy_effect] e = some(where (p.eft == allow)) # Matchers [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
g, g2, g3 表示不同的 RBAC 體系, _, _ 表示用戶和角色 _, _, _ 表示用戶, 角色, 域(也就是租戶)
ACL model的示例policy如下:
p, alice, data1, read p, bob, data2, write
Model 語法:
-
Model CONF 至少應包含四個部分:
[request_definition], [policy_definition], [policy_effect], [matchers]。 -
如果 model 使用 RBAC, 還需要添加
[role_definition]部分
policy 不同,model 只能加載,不能保存。 因為我們認為 model 不是動態組件,不應該在運行時進行修改,所以我們沒有實現一個 API 來將 model 保存到存儲中.
policy file
定義具體的策略, 權限的檢查就是基於定義的 model file 和 policy file 來完成的.
相對於 model file 定義規則, policy file 中定義的就是具體的內容.
如何使用?
創建一個Casbin決策器需要有一個模型文件和策略文件為參數:
import "github.com/casbin/casbin"
e := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
在訪問發生之前, 在代碼中添加強制掛鈎:(這一步就是校驗訪問控制權,然后根據返回值做對象的分之操作)
sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.
if e.Enforce(sub, obj, act) == true {
// permit alice to read data1
} else {
// deny the request, show an error
}
casbin 存儲到數據庫的記錄是策略, 訪問控制模型當系統確定戶基本很少改動。可以存儲到項目配置文件(本地)
casbin 存儲RBAC方案中用戶和角色之間的映射關系。(而這個關系是基於 midel 訪問控制模型)
權限管理系統最好全局依賴 一個Casbin 決策器(這個決策器 依賴 模型文件和策略文件為參數)
在訪問發生之前,在代碼中加入強制鈎子,控制。
這個請求格式是可以自定義的, 默認為默認的請求格式為 { subject, object , action }
sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.
if e.Enforce(sub, obj, act) == true {
// permit alice to read data1
} else {
// deny the request, show an error
}
Casbin 模型可以是多個組合。也可以共享同一組policy規則。
數據庫里存儲的 策略 第一個字段代表的是在 model 里定義的模型類型。
p, alice, data1, read 其中的 p 是在 model.conf 文件中定義好的。
多租戶示例
定義 model file
[request_definition] r = sub, dom, obj, act // 這里定義的是請求格式 [policy_definition] p = sub, dom, obj, act // 這里定義的是策略格式模型 [role_definition] g = _, _, _ // 這里定義的也是策略的一種模型 [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Cabin 沒有驗證用戶是否是有效的用戶,或者角色是一個有效的角色。 這應該通過認證來解決。
參考資料:https://www.cnblogs.com/xiaohunshi/p/10372881.html
https://www.cnblogs.com/wang_yb/archive/2018/11/20/9987397.html
