目前用 golang 的 casbin 库来实现 RBAC 模型做基本的权限控制。有几下几点:
1
JKeita 2021-09-01 15:49:41 +08:00
控制到对应 url 及请求方式就够了,那种什么修改自己还是修改别人密码的特殊逻辑就放到业务逻辑。
|
2
xuanbg 2021-09-01 20:02:00 +08:00
不需要存在什么超级管理员,只需要初始化一个用户,一个管理员角色,以及给管理员角色初始化必要的权限并把这个用户添加到角色就行了。
权限的粒度一般都是一个独立的操作,大部分这种独立操作都能对应到 1 个或多个接口。所以,我可以在网关上面根据 url 来实现鉴权。从而使用户 /角色 /权限能够抽象出来,成为独立于业务存在通用能力。 |
3
seyoatda OP |
4
hsluoyz 2021-09-03 12:48:31 +08:00
@seyoatda 你好,我是 Casbin 作者。
1. 用 ACL with superuser 模型即可: https://casbin.org/docs/en/supported-models 2. 这种一般是用 ABAC 来解决:判断主体(用户)与客体(密码)的 owner 是不是一致: https://github.com/casbin/casbin/blob/master/examples/abac_model.conf 不过这样密码就是一个实体了,其实比较怪异,可以直接添加一个 set-password API 来设置自己密码,管理员针对其他用户( User )的所有字段具有修改权限。具体怎么设计可以有无数种方式,不同的设计会导致 Casbin 使用上的不同,需要具体问题具体分析。 |
5
seyoatda OP @hsluoyz 嗯嗯谢谢~。前阵子一直在看 casbin 的文档。感觉自己对权限这块的基础知识还需要加深学习哈哈,在设计和实现上有点踌躇不前。
|
6
Tinywan 2021-09-07 14:08:31 +08:00
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) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == 1 ``` |