1. 前言
官方中只教了如何设置一个用户为超级管理员
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act || r.sub == "root"
r.sub == “root” // 请求中用户为root是超级管理员
需求:RBAC中,超级管理员是角色,如何验证多个用户是超级管理员?
2. 环境
- github.com/casbin/casbin/v2 v2.28.3
- github.com/casbin/gorm-adapter/v3 v3.2.12
3. 解决办法
使用自定义的函数
- 向 casbin 中添加自定义函数
adapter, _ := gormadapter.NewAdapterByDB(database.DB.Self)
Enforcer, _ = casbin.NewEnforcer("conf/auth_model.conf", adapter)
Enforcer.EnableLog(true)
err := Enforcer.LoadPolicy()
if err != nil {
log.Fatalf(err, "Enforcer.LoadPolicy fail")
panic(err)
}
// 设置用户root的角色为superadmin
Enforcer.AddRoleForUser("root","superadmin")
// 添加自定义函数
Enforcer.AddFunction("checkSuperAdmin", func(arguments ...interface{}) (interface{}, error) {
// 获取用户名
username := arguments[0].(string)
// 检查用户名的角色是否为superadmin
return Enforcer.HasRoleForUser(username,"superadmin")
})
- 修改 casbin 中的 matchers
[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) && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || checkSuperAdmin(r.sub)
特殊的一行
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || checkSuperAdmin(r.sub)
此处可以直接使用刚刚自定义的函数 checkSuperAdmin(username) 即可
4. 效果
只要用户的角色为 superadmin ,那么不受权限控制。
5. 参考文档
如果有其他方法可以评论交流
觉得该博文有帮助请帮忙点个赞!!!
觉得该博文有帮助请帮忙点个赞!!!
觉得该博文有帮助请帮忙点个赞!!!