casbin简介
# Casbin
Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
文档地址:https://casbin.org/docs/zh-CN/overview (opens new window)
# 新建项目 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
工作原理:https://casbin.org/docs/zh-CN/how-it-works (opens new window)
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
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 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("运行通过")
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
从上面策略来看,用户lisi
继承member
,而member
对/depts
的GET
请求时有的,所以会执行运行通过
➜ gcasbin go run main.go
2022/10/12 22:21:27 运行通过
1
2
2
如果act
换成POST
,那就不能通过;如果sub
换成wujie
,那么无论是GET
请求还是POST
请求都能进行访问。
编辑 (opens new window)
上次更新: 2022/10/12, 22:42:52