跳到主要内容

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

  1. request_definition:请求定义

r = sub, obj, act,必须传这 3 段而且得和策略进行关联

  • 访问实体:subject
  • 访问资源:object
  • 访问方法:action

譬如:xxx 这个用户要访问/users并且是GET请求,则写成

  • xxx sub
  • /users obj
  • GET act
  1. policy_definition:策略定义,也叫模型定义

p = sub, obj, act

定义和上述一样

  1. role_definition:角色定义

g=_,__,_表示角色继承关系的前项和后项,即前项继承后项角色的权限

  1. policy_effect:策略的生效范围

e = some(where (p.eft == allow)),如果存在任意一个决策结果为allow的匹配规则,则最终决策结果为allowp.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/deptsGET请求时有的,所以会执行运行通过

➜  gcasbin go run main.go
2022/10/12 22:21:27 运行通过

如果act换成POST,那就不能通过;如果sub换成wujie,那么无论是GET请求还是POST请求都能进行访问。