Casbin使用套路
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型
Model语法
https://casbin.org/docs/zh-CN/syntax-for-models
sub, obj, act
表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。 但是, 你可以自定义你自己的请求表单, 如果不需要指定特定资源,则可以这样定义 sub、act
,或者如果有两个访问实体, 则为 sub、sub2、obj、act
。
实际例子:
如 cr-mao这个用户 要访问/users ,GET 请求, 这些都可以理解为字符串…
sub=cr-mao
obj = /users
act = GET
基于角色的访问控制
https://casbin.org/docs/zh-CN/rbac
1[role_definition]
2g = _, _
3g2 = _, _
1g, alice, data2_admin #alice 是 data2_admin 的一个成员
实际代码举例
1go get github.com/casbin/casbin/v2
p.csv 内容如下:
1p, member, /depts, GET
2p, member, /depts/:id, GET
3
4p, admin, /depts, POST
5p, admin, /depts/:id, PUT
6p, admin, /depts/:id, DELETE
7
8g, admin, member
9g, cr-mao, admin
10g, lishuai, member
cr-mao是admin ( 管理员)
管理员拥有member权限(admin 继承 member)
lishuai 是member (成员),只有member权限,没有admin权限
权限大的在前面
model.conf 内容如下:
1[request_definition]
2r = sub, obj, act
3
4[policy_definition]
5p = sub, obj, act
6
7[role_definition]
8g = _, _
9
10[policy_effect]
11e = some(where (p.eft == allow))
12
13[matchers]
14m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
1package main
2
3import (
4 "github.com/casbin/casbin"
5 "log"
6)
7
8func main() {
9 // /depts
10 sub := "cr-mao" // 想要访问资源的用户。
11 obj := "/depts" // 将被访问的资源。
12 act := "GET" // 用户对资源执行的操作。
13 e := casbin.NewEnforcer("resources/model.conf", "resources/p.csv")
14
15 ok := e.Enforce(sub, obj, act)
16 if ok {
17 log.Println("运行通过")
18 } else {
19 log.Println("运行不通过")
20 }
21}