Browse Source

优化:casbin验证优化,在中间件中获取请求的 Path,在CasbinModel定义中直接使用keymatch2进行匹配,减少一次path获取和函数调用。

server/middleware/casbin_rbac.go:18行修改为请求的path作为obj
server/service/system/sys_casbin.go:删掉无用的注册函数
server/resource/rbac_model.conf:验证函数修改为keyMathc2
main
dyzsoft 3 years ago
parent
commit
6215328815
  1. 4
      server/middleware/casbin_rbac.go
  2. 2
      server/resource/rbac_model.conf
  3. 28
      server/service/system/sys_casbin.go

4
server/middleware/casbin_rbac.go

@ -14,8 +14,8 @@ var casbinService = service.ServiceGroupApp.SystemServiceGroup.CasbinService
func CasbinHandler() gin.HandlerFunc {
return func(c *gin.Context) {
waitUse, _ := utils.GetClaims(c)
// 获取请求的URI
obj := c.Request.URL.RequestURI()
// 获取请求的PATH
obj := c.Request.URL.Path
// 获取请求方法
act := c.Request.Method
// 获取用户的角色

2
server/resource/rbac_model.conf

@ -11,4 +11,4 @@ g = _, _
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && ParamsMatch(r.obj,p.obj) && r.act == p.act
m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act

28
server/service/system/sys_casbin.go

@ -2,11 +2,9 @@ package system
import (
"errors"
"strings"
"sync"
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/util"
gormadapter "github.com/casbin/gorm-adapter/v3"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
@ -104,33 +102,7 @@ func (casbinService *CasbinService) Casbin() *casbin.SyncedEnforcer {
once.Do(func() {
a, _ := gormadapter.NewAdapterByDB(global.GVA_DB)
syncedEnforcer, _ = casbin.NewSyncedEnforcer(global.GVA_CONFIG.Casbin.ModelPath, a)
syncedEnforcer.AddFunction("ParamsMatch", casbinService.ParamsMatchFunc)
})
_ = syncedEnforcer.LoadPolicy()
return syncedEnforcer
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ParamsMatch
//@description: 自定义规则函数
//@param: fullNameKey1 string, key2 string
//@return: bool
func (casbinService *CasbinService) ParamsMatch(fullNameKey1 string, key2 string) bool {
key1 := strings.Split(fullNameKey1, "?")[0]
// 剥离路径后再使用casbin的keyMatch2
return util.KeyMatch2(key1, key2)
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ParamsMatchFunc
//@description: 自定义规则函数
//@param: args ...interface{}
//@return: interface{}, error
func (casbinService *CasbinService) ParamsMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)
return casbinService.ParamsMatch(name1, name2), nil
}
Loading…
Cancel
Save