Casbin
Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
文档地址:https://casbin.org/docs/zh-CN/overview
新建项目 gcasbin
新建目录resources
在里面新建一个model.conf
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
工作原理:https://casbin.org/docs/zh-CN/how-it-works
request_definition
:请求定义
r = sub, obj, act
,必须传这 3 段而且得和策略进行关联
- 访问实体:
subject
- 访问资源:
object
- 访问方法:
action
譬如:xxx 这个用户要访问/users
并且是GET
请求,则写成
xxx sub
/users obj
GET act
policy_definition
:策略定义,也叫模型定义
p = sub, obj, act
定义和上述一样
role_definition
:角色定义
g=_,_
:_,_
表示角色继承关系的前项和后项,即前项继承后项角色的权限
policy_effect
:策略的生效范围
e = some(where (p.eft == allow))
,如果存在任意一个决策结果为allow
的匹配规则,则最终决策结果为allow
,p.eft
就是决策结果。
示例:!some(where (p.eft == deny))
表示任何一个决策结果都不能是deny
通过matchers
将上面进行关联
再新建一个p.csv
,这是一个策略,一般来说实际开发,是放在数据库里的,特别少的可以使用文件配置,这里只是个简单模拟
p, member, /depts, GET
p, member, /depts/:id, GET
p, admin, /depts, POST
p, admin, /depts/:id, PUT
p, admin, /depts/:id, DELETE
g, admin, member
g, wujie, admin
g, lisi, member
demo 代码
package main
import (
"github.com/casbin/casbin"
"log"
)
func main() {
sub := "lisi"
obj := "/depts"
act := "GET"
e := casbin.NewEnforcer("resources/model.conf", "resources/p.csv")
// 决策是否可以访问
ok := e.Enforce(sub, obj, act)
if ok {
log.Println("运行通过")
}
}
从上面策略来看,用户lisi
继承member
,而member
对/depts
的GET
请求时有的,所以会执行运行通过
➜ gcasbin go run main.go
2022/10/12 22:21:27 运行通过
如果act
换成POST
,那就不能通过;如果sub
换成wujie
,那么无论是GET
请求还是POST
请求都能进行访问。