golang Casbin在 RBAC 或 带域RBAC 中设置 多个 超级管理员superadmin 角色教程 自定义检测函数

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. 环境

  1. github.com/casbin/casbin/v2 v2.28.3
  2. github.com/casbin/gorm-adapter/v3 v3.2.12

3. 解决办法

使用自定义的函数

  1. 向 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")
})
  1. 修改 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. 参考文档

官方-自定义函数
官方-超级管理员教程

如果有其他方法可以评论交流

觉得该博文有帮助请帮忙点个赞!!!
觉得该博文有帮助请帮忙点个赞!!!
觉得该博文有帮助请帮忙点个赞!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值