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