go Casbin配置檔案,以及匹配規則

a.亮亮亮wl發表於2020-10-13

今天學了一下casbin,對caspin的怎麼匹配的有了心得,我自己的理解,相關資料也沒有查詢,只是為了把我的想法在此記錄下來

引用一下https://juejin.im/post/6844904191257739277#heading-1該文件的例子,我也是根據這個學的。

我們首先編寫模型檔案:

model.conf
[request_definition] //接收器,程式碼裡呼叫e.Enforce(sub, obj, act)的時候,會把值賦給這幾個引數
r = sub, obj, act

[policy_definition]//匹配器,用cvs檔案賦值
p = sub, obj, act

[matchers]//匹配方法
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

[policy_effect]//匹配的結果通過p.eft獲取,some(where (p.eft == allow))表示只要有一條策略允許即可。
e = some(where (p.eft == allow))

然後我們策略檔案(即誰能對什麼資源進行什麼操作):

policy.csv
p, dajun, data1, read
p, lizi, data2, write

上面policy.csv檔案的兩行內容表示dajun對資料data1有read許可權,lizi對資料data2有write許可權。

然後程式碼

package main

import (
  "fmt"
  "log"

  "github.com/casbin/casbin/v2"
)

func check(e *casbin.Enforcer, sub, obj, act string) {
  ok, _ := e.Enforce(sub, obj, act)
  if ok {
    fmt.Printf("%s CAN %s %s\n", sub, act, obj)
  } else {
    fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
  }
}

func main() {
  e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
  if err != nil {
    log.Fatalf("NewEnforecer failed:%v\n", err)
  }

  check(e, "dajun", "data1", "read")
  check(e, "lizi", "data2", "write")
  check(e, "dajun", "data1", "write")
  check(e, "dajun", "data2", "read")
}
程式碼其實不復雜。首先建立一個casbin.Enforcer物件,載入模型檔案model.conf和策略檔案policy.csv,呼叫其Enforce方法來檢查許可權。

執行程式的結果:

dajun CAN read data1
lizi CAN write data2
dajun CANNOT write data1
dajun CANNOT read data2

這裡看一下是如何判斷的,以第一條為例

呼叫check(e, "dajun", "data1", "read"),配置檔案寫著r = sub, obj, act,此時,r = dajun,data1,read,把引數賦值給r
然後根據匹配規則做判斷 m = r.sub == p.sub && r.obj == p.obj && r.act == p.act是否為true,因為policy.csv檔案配置了2條策略,所以會依次做判斷。比如第一條策略是 p, dajun, data1, read。那麼判斷就是r.dajun == p.dajun&&r.data1==p.data1&&r.read == p.read,結果就是true

相關文章