本文介绍golang中RBAC(基于角色的权限控制)的使用方式
什么是RBAC
RBAC 是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
实现
我选用的是github.com/casbin/casbin
,选择原因:社区的认同(Star很高)。
安装
1 | go get github.com/casbin/casbin |
定义模型
conf/rbac_model.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14[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 = r.sub == p.sub && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")conf/policy.csv
权限细则,可以读csv文件,可以读数据库。。1
2
3
4
5
6
7
8p, admin, /*, *
p, anonymous, /article, GET
p, anonymous, /article/*, GET
p, member, /permission, GET
p, member, /article, GET
p, member, /article/*, *
g, test01, anonymous
g, user01, member说明:
line 1: 定义admin角色能访问所有资源
line 2,3: 定义anonymous角色能查看文章列表、文章详情
line 4: 定义member角色能获取权限
line 5,6: 定义member角色能访问文章所有权限
line 7: 定义test01的角色为anonymous
line 8: 定义user01的角色为member
定义中间件
1 | // enforcer.go |
web服务
1 | package main |
测试
启动
1
go run mian.go
测试
1
2
3
4
5
6
7
8curl localhost:8888/article
// output: {"data":"paginate"}
curl localhost:8888/article/1
// output: {"data":"info:1"}
curl localhost:8888/permission
// output: StatusUnauthorized
curl localhost:8888/permission?role=member&user=user01
// output: {"data":[["member","/permission","GET"],["member","/article","GET"],["member","/article/*","*"]]}
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2020/04/25/golang-rbac/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!