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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值