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}