66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package middleware
|
||
|
||
import (
|
||
"strconv"
|
||
"strings"
|
||
|
||
"kra/pkg/casbin"
|
||
"kra/pkg/response"
|
||
"kra/pkg/utils"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// CasbinConfig Casbin中间件配置
|
||
type CasbinConfig struct {
|
||
RouterPrefix string // 路由前缀,需要从路径中去除
|
||
}
|
||
|
||
// 全局配置
|
||
var casbinConfig *CasbinConfig
|
||
|
||
// SetCasbinConfig 设置Casbin配置
|
||
func SetCasbinConfig(cfg *CasbinConfig) {
|
||
casbinConfig = cfg
|
||
}
|
||
|
||
// CasbinHandler Casbin权限拦截器(与 kra 保持一致)
|
||
func CasbinHandler() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
waitUse, _ := utils.GetClaims(c)
|
||
if waitUse == nil {
|
||
response.FailWithDetailed(gin.H{}, "权限不足", c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
|
||
// 获取请求的PATH
|
||
path := c.Request.URL.Path
|
||
// 去除路由前缀
|
||
if casbinConfig != nil && casbinConfig.RouterPrefix != "" {
|
||
path = strings.TrimPrefix(path, casbinConfig.RouterPrefix)
|
||
}
|
||
|
||
// 获取请求方法
|
||
act := c.Request.Method
|
||
// 获取用户的角色
|
||
sub := strconv.Itoa(int(waitUse.AuthorityID))
|
||
|
||
// 判断策略中是否存在
|
||
e := casbin.GetEnforcer()
|
||
if e == nil {
|
||
response.FailWithDetailed(gin.H{}, "Casbin未初始化", c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
|
||
success, _ := e.Enforce(sub, path, act)
|
||
if !success {
|
||
response.FailWithDetailed(gin.H{}, "权限不足", c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
c.Next()
|
||
}
|
||
}
|