Files
learn-golang/Web开发/06go-auth-api/middleware.go
liumangmang b010f82221 feat(auth): 添加完整的用户认证API项目
- 实现用户注册、登录、JWT令牌认证功能
- 集成Gin、GORM、Viper、Zap等框架
- 添加密码加密、数据库操作、中间件等完整功能
- 配置多环境支持、日志轮转、CORS处理
- 创建完整的项目结构和配置文件体系
2025-12-30 18:00:42 +08:00

95 lines
2.5 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 main
import (
"strings"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// LoggingMiddleware 创建一个请求日志中间件
// 该中间件会在每个HTTP请求进入时记录请求信息在响应返回时记录响应信息
// 参数: 无
// 返回值: gin.HandlerFunc - Gin框架的中间件处理函数
func LoggingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求日志方法、路径、客户端IP
Logger.Info("请求",
zap.String("方法", c.Request.Method),
zap.String("路径", c.Request.URL.Path),
zap.String("IP", c.ClientIP()),
)
c.Next()
// 记录响应日志:路径、状态码
Logger.Info("响应",
zap.String("路径", c.Request.URL.Path),
zap.Int("状态码", c.Writer.Status()),
)
}
}
// AuthMiddleware JWT 认证中间件
// 参数: cfg - 配置对象包含JWT密钥等配置信息
// 返回值: gin.HandlerFunc - Gin框架的中间件处理函数
func AuthMiddleware(cfg *Config) gin.HandlerFunc {
return func(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
c.JSON(401, gin.H{"错误": "错误的认证头"})
c.Abort()
return
}
// 解析Authorization头验证格式为 "Bearer <token>"
parts := strings.SplitN(authHeader, " ", 2)
if len(parts) != 2 || parts[0] != "Bearer" {
c.JSON(401, gin.H{"错误": "错误的认证头"})
c.Abort()
return
}
// 验证JWT token的有效性
claims, err := VerifyToken(parts[1], cfg.JWT.Secret)
if err != nil {
Logger.Error("验证token失败", zap.Error(err))
c.JSON(401, gin.H{"错误": "验证token失败"})
c.Abort()
return
}
// 将用户信息保存到上下文
c.Set("user_id", claims.UserID)
c.Set("email", claims.Email)
c.Next()
}
}
// CORSMiddleware 创建并返回一个CORS跨域资源共享中间件处理器
// 该中间件用于处理跨域请求,设置相应的响应头信息
//
// 参数:
//
// 无
//
// 返回值:
//
// gin.HandlerFunc - Gin框架的中间件处理器函数
func CORSMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 设置CORS相关响应头
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
// 处理预检请求OPTIONS方法
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
}
}