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