栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

gin-配合gorm使用casbin的域内RBAC

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

gin-配合gorm使用casbin的域内RBAC

model文件
[request_definition]
r = sub, dom, obj, act

[policy_definition]
p = sub, dom, obj, act

[role_definition]
g = _, _, _


[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub, r.dom)&& r.dom == p.dom && r.obj == p.obj && r.act == p.act
初始化Enforcer
func (casbinService *CasbinService) Casbin() *casbin.SyncedEnforcer {
	once.Do(func() {
		a, _ := gormadapter.NewAdapterByDB(global.GVA_DB)
		syncedEnforcer, _ = casbin.NewSyncedEnforcer(global.GVA_CONFIG.Casbin.ModelPath, a)
	})
	err := syncedEnforcer.LoadPolicy()
	//syncedEnforcer.AddNamedPolicy("p", "1", "1", "www", "POST")
	//syncedEnforcer.SavePolicy()
	//res := syncedEnforcer.GetPermissionsForUserInDomain("1", "1")
	//fmt.Printf("**************%#v",res)
	fmt.Println(err)
	return syncedEnforcer
}
casbin_rule表的对应结构体
type CasbinRule struct {
	ID    uint   `gorm:"primaryKey;autoIncrement"`
	PType string `gorm:"size:512;"`
	V0    string `gorm:"size:512;"`
	V1    string `gorm:"size:512;"`
	V2    string `gorm:"size:512;"`
	V3    string `gorm:"size:512;"`
	V4    string `gorm:"size:512;"`
	V5    string `gorm:"size:512;"`
}
//这里是确定该表的表名的部分,具体是什么原理,还未探究
func (CasbinRule) TableName() string {
	return "casbin_rule"
}
权限校验
success, _ = e.Enforce(sub, dom, obj, act)
问题 1.casbin规则表表名问题

在开发期间,casbin在数据库的数据被手动添加到了casbin的规则表中了。就是使用GORM自动根据对应的结构体在程序启动时自动生成数据库的表,目前根据表面体现的现象,在这些自动生产的表中有的会自动在表名后面加上“s”表示复数。
例:
如果我使用我上面的CasbinRule结构体,不要那个TableName()方法去固定表名,只要结构体,gorm就会在数据库里面生成一个名字叫“casbin_rules”的表,反正生成的表名就是对应结构体名的复数形式
但是,casbin就不可以让表名变成复数,只能是“casbin_rule"因为casbin要从数据库加载policy是默认从程序配置的 a, _ := gormadapter.NewAdapterByDB(global.GVA_DB)数据库连接配置中的数据库中去找名叫“casbin_rule”的表,如果找不到这个表,casbin就会自己创建一个叫“casbin_rule”的表,这时,你去想获取某个用户的权限的时候或者去做权限校验的时候,是没法获取权限,校验不会通过的。,因为那是一张空表,没有任何权限。

发现这个问题时通过在上文**“初始化Enforcer”**中的那几行注释的代码。我发现通过代码添加的policy就会一直保存,并且可以获取到,就让我觉得是不是程序从别的地方存放,获取policy,之后看源码才发现了源码中写定了表名

源码

下图就是自动生成表的来源



2.casbin对应结构体的字段名

看上面最后一张图CasbinRule结构体,如果你定义的结构体和这个不一样,casbin在获取policy的时候也会出错

源码


在gorm中查询时,是按照给如的结构体来查询对应的字段的,如果不对,结果就不会映射到正确的字段中,类似mybatis中xml文件与pojo类的映射

数据库casbin表的大概内容


错误 1. grouping policy elements do not meet role definition

[分组策略元素不符合角色定义]
在只是基于角色的策略情况下,根角色没有任何父角色,在数据库的记录为下图

如果角色4的父角色为空值,那么就会出错,所以将其赋值为0

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号