casbin的分析

小魂師發表於2019-02-14

casbin的分析

問題

一般的專案中,都會有許可權認證模組,用來控制不同的角色,可以訪問的功能。比較出名的許可權控制模型有ACL和RABC。如果每個專案中,都重新實現許可權控制模組,這樣操作會比較繁瑣,希望有一個統一的簡單模組來控制許可權,而casbin這個開源專案,可以支援acl,rabc和abac這幾個模式的許可權控制,能夠通過簡單的配置就整合到專案中使用。

原理分析

casbin通過配置檔案來對許可權模型進行配置,將一個許可權的模型劃分為:request,policy,policy_effect和matchers,典型的配置格式(RABC):

# 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

sub, obj, act,分別表示,使用者(或者分組),資源物件,許可權

  • request_definition:表示請求的格式
  • policy_definition:表示許可權的格式
  • policy_effect:表示匹配之後的動作
  • matchers:表示匹配的規則,通過運算得出bool值

有了許可權定義的檔案之後,還需要有一個使用者或者角色分組的儲存的資訊:

p, alice, data1, read
p, bob, data2, write

這裡的格式,表示:

  • alice對資源data1可以進行read
  • bob對資源data2可以進行write

當alice去讀取data1的時候,就會觸發matchers的規則,通過儲存的角色資訊進行運算,按照上面的例子,就可以通過稽核。

通過對許可權配置和使用者角色儲存的結構進行組合,然後按照matchers的規則,就可以得出使用者是否有許可權對資源進行訪問了。

支援的比較函式

對於匹配規則,可以支援簡單的運算,還有就是支援幾個內建的函式,方便進行匹配運算:

fm.AddFunction("keyMatch", util.KeyMatchFunc)
fm.AddFunction("keyMatch2", util.KeyMatch2Func)
fm.AddFunction("regexMatch", util.RegexMatchFunc)
fm.AddFunction("ipMatch", util.IPMatchFunc)

函式的含義:

  • keyMatch:能夠支援使用*匹配進行匹配匹配
  • keyMatch2:能夠支援*號匹配和/:resource的模式
  • regexMatch:能夠支援正則匹配
  • ipMatch:能夠對ip格式進行匹配,”192.168.2.123″ matches “192.168.2.0/24”

支援對主流的框架支援

需要支援的框架,包括web框架和儲存框架,使用adapter進行支援,現在可以支援的框架,包括:

  • gin
  • gorm
  • file
  • xorm
  • protobuf
  • ….

更多的檢視官網

多語言支援

現在有多種語言版本的支援:

  • golang
  • java
  • php
  • ….

更多的檢視官網

總結

casbin使用起來比較簡單容易,功能比較強大,能夠滿足需求,而且程式碼比較清晰易懂,作者也很有趣,值得使用。

參考資料

相關文章