1. 程式人生 > 其它 >casbin 學習筆記【1】

casbin 學習筆記【1】

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 鑑權