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. 参考文档

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

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