添加中间件
This commit is contained in:
48
internal/middleware/auth.go
Normal file
48
internal/middleware/auth.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
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.Header.Get("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("userId", tokenOut.UserId)
|
||||||
|
r.SetCtxVar("permission", tokenOut.Permission)
|
||||||
|
r.SetCtxVar("jti", tokenOut.JTI)
|
||||||
|
}
|
||||||
|
r.Middleware.Next()
|
||||||
|
}
|
||||||
11
internal/middleware/response.go
Normal file
11
internal/middleware/response.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gogf/gf/v2/net/ghttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Response 统一响应中间件
|
||||||
|
func Response(r *ghttp.Request) {
|
||||||
|
r.Middleware.Next()
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user