任务二完成
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/go-kratos/kratos/v2/middleware"
|
||||
"github.com/go-kratos/kratos/v2/transport"
|
||||
|
||||
pkgcasbin "kra/pkg/casbin"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrPermissionDenied = errors.New("权限不足")
|
||||
)
|
||||
|
||||
// CasbinRBAC Casbin权限中间件
|
||||
func CasbinRBAC(routerPrefix string) middleware.Middleware {
|
||||
return func(handler middleware.Handler) middleware.Handler {
|
||||
return func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
claims, ok := GetClaims(ctx)
|
||||
if !ok {
|
||||
return nil, ErrMissingToken
|
||||
}
|
||||
|
||||
if tr, ok := transport.FromServerContext(ctx); ok {
|
||||
// 获取请求路径
|
||||
path := tr.Operation()
|
||||
if routerPrefix != "" {
|
||||
path = strings.TrimPrefix(path, routerPrefix)
|
||||
}
|
||||
|
||||
// 获取请求方法
|
||||
act := "GET"
|
||||
if header := tr.RequestHeader(); header != nil {
|
||||
if method := header.Get(":method"); method != "" {
|
||||
act = method
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户角色
|
||||
sub := strconv.Itoa(int(claims.AuthorityID))
|
||||
|
||||
// 检查权限
|
||||
enforcer := pkgcasbin.GetEnforcer()
|
||||
if enforcer == nil {
|
||||
return handler(ctx, req)
|
||||
}
|
||||
|
||||
success, err := enforcer.Enforce(sub, path, act)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !success {
|
||||
return nil, ErrPermissionDenied
|
||||
}
|
||||
}
|
||||
|
||||
return handler(ctx, req)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user