casbin 學習筆記【1】
阿新 • • 發佈:2022-05-12
1. casbin 是什麼
開源的訪問控制庫,支援多種訪問控制模型
- 支援自定義訪問控制語法
- 管理訪問控制模型及策略的儲存
- 支援RBAC 的角色關係對映
- 內建超級使用者
- 內建多種規則匹配運算元
- 訪問控制不是賬戶驗證,casbin不提供密碼驗證功能
- casbin也不會儲存任何使用者資訊(如角色、密碼等)
2. casbin hello world
2.1. 建立一個casbin執行器例項:
e, err := casbin.NewEnforcer(model, adapter)
需要兩個引數,第一個是訪問控制模型,第二個是介面卡(supported-adapters)
- 預設模式,傳入模型檔案和檔案介面卡(使用者許可權配置):
e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
- 傳入符合格式的模型字串和資料庫介面卡:
a, err := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/casbin") m, err := model.NewModelFromString(` [request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [policy_effect] e = some(where (p.eft == allow)) [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act `) e, err := casbin.NewEnforcer(m, a)
也可以用gorm來適配資料庫:adapter, err := gormadapter.NewAdapterByDB(db)
2.2. 檢查許可權
-
ok, err := e.Enforce(sub, obj, act)
, 把這裡類比成語言中的主謂賓就很好理解了
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. ok, err := e.Enforce(sub, obj, act) if err != nil { // handle err } if ok == true { // permit alice to read data1 } else { // deny the request, show an error }
- 批量檢查
results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
返回一個布林切片,其中 results[0] 為{"alice", "data1", "read"}
的許可權檢查結果,以此類推。 - casbin 也提供執行時的許可權管理介面
roles, err := e.GetRolesForUser("alice")
Management API
3. 模型檔案的格式
model.conf
檔案包含以下4個部分:Policy, Effect, Request, Matchers
3.1 request
定義請求引數及其順序, 最少需要主謂賓三個, 比如剛剛的r = sub, obj, act
3.2 policy
- policy definition
提供了訪問策略的定義,比如有如下策略定義:
[policy_definition]
p = sub, obj, act
p2 = sub, act
而實際策略(policy.csv)為:
p, alice, data1, read
p2, bob, write-all-objects
通過p和p2,策略定義為實際策略中的多條記錄提供了匹配機制:
(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)
- policy effect
策略生效規則,定義了當一個請求符合多個策略時,應該如何提供訪問許可權,是對Matchers的匹配結果再次進行邏輯組合判斷的模型。 比如:
[policy_effect]
e = some(where (p.eft == allow))
其中,p.eft
是策略最終生效的結果,即同意allow
或不同意deny
,以上定義的意思是,只要有任一條策略同意,則最終生效結果為同意。e = some (where (p.eft == allow)) && !some(where (p.eft == deny)
有符合允許結果的策略,並且,無符合拒絕結果的策略,則結果為真
實際上目前casbin只提供了預定義的5個policy effect:policy-effect
3.3 Matcher
定義了request 和 policy的匹配規則。
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
最簡單的匹配,表示request 和policy中的主謂賓應該一致
3.4 例子
ACL model:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
policy.csv:
p, alice, data1, read
p, bob, data2, write
意思是,alice可以讀data1,bob可以寫data2
3.5 RBAC 和ABAC的區別
- 基於角色的訪問控制 (Role-based access control)
- 基於屬性的訪問控制(Attribute-based access control - ABAC)使用 ABAC 鑑權