Files
arenax-server/internal/middleware/auth.go
2025-06-05 10:20:01 +08:00

49 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package middleware
import (
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/glog"
"server/utility/ecode"
"server/utility/jwt"
"strings"
)
// Auth 是用于权限验证的中间件。
//
// 它会从请求头中读取 Authorization 字段,验证 JWT Token 的合法性。
// 如果请求未携带 Token则默认赋予 "guest" 权限。
// 如果 Token 存在且合法则将用户信息userId、permission、jti注入到请求上下文中。
//
// Token 应采用 Bearer 方案,例如:
//
// Authorization: Bearer <token>
//
// 参数:
//
// r *ghttp.Request - 当前的请求对象,由 ghttp 框架自动注入。
//
// 行为:
// - 若无 Token设定 permission 为 guest放行请求。
// - 若 Token 格式非法或解析失败:终止请求并返回错误。
// - 若 Token 合法:将用户信息写入上下文,继续执行下一个中间件或处理函数。
func Auth(r *ghttp.Request) {
token := r.GetHeader("Authorization")
ctx := r.GetCtx()
if token == "" {
glog.Infof(ctx, "未登录用户访问: %s %s", r.URL.Path, r.Method)
r.SetCtxVar("permission", "guest")
} else {
if !strings.HasPrefix(token, "Bearer ") {
Exit(r, ecode.InvalidOperation.Sub("无效的token格式"))
}
tokenOut, err := jwt.ParseToken(token)
if err != nil {
Exit(r, err)
}
r.SetCtxVar("id", tokenOut.UserId)
r.SetCtxVar("role", tokenOut.Role)
r.SetCtxVar("jti", tokenOut.JTI)
}
r.Middleware.Next()
}