uniugm/admin/apps/game/server/middleware.go
2025-05-14 18:09:20 +08:00

81 lines
1.9 KiB
Go

package server
import (
apiUser "admin/apps/user/api"
"admin/internal/context"
"admin/internal/errcode"
"admin/internal/permission"
"strings"
)
func (srv *Server) CheckToken(ctx *context.WebContext) {
if strings.Contains(ctx.GinCtx().Request.URL.Path, "/login") {
return
}
err := ctx.ExtractHeader()
if err != nil {
ctx.Fail(errcode.New(errcode.HeaderParamsInvalid, "header invalid"))
return
}
authRsp, err := apiUser.GetUserApiInstance().Auth(ctx, &apiUser.AuthReq{
Token: ctx.Header.Token,
UserId: ctx.Header.UserId,
})
if err != nil {
ctx.Fail(err)
return
}
ctx.Header.UserName = authRsp.User.NickName
ctx.GinCtx().Set("userInfo", authRsp)
ctx.GinCtx().Next()
return
}
func (srv *Server) CheckPermissions(ctx *context.WebContext) {
userInfoI, find := ctx.GinCtx().Get("userInfo")
if !find {
ctx.Fail(errcode.New(errcode.TokenInvalid, "not found ctx userInfo"))
return
}
userInfo, _ := userInfoI.(*apiUser.UserInfo)
projectId, resource := getCtxURIProjectIdAndResource(ctx)
if projectId <= 0 {
if ctx.GinCtx().Request.URL.Path == "/api/project" {
if userInfo.Character != "admin" {
ctx.Fail(errcode.New(errcode.NoPermission, "user %v is not admin, can't operate project", ctx.Header.UserId))
return
}
ctx.GinCtx().Next()
return
}
ctx.Fail(errcode.New(errcode.NoPermission, "project_id %v in ctx invalid", projectId))
return
}
if resource == "" {
ctx.Fail(errcode.New(errcode.NoPermission, "resource %v in ctx invalid", resource))
return
}
reqPermission := permission.GetProjectResourcePermission(projectId, resource, ctx.GinCtx().Request.Method)
if userInfo.Character == "admin" {
ctx.GinCtx().Next()
return
}
for _, v := range userInfo.Permissions {
if reqPermission == v {
ctx.GinCtx().Next()
return
}
}
ctx.Fail(errcode.New(errcode.NoPermission, "user %v don't have permission %v", ctx.Header.UserId, reqPermission))
return
}