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