99 lines
2.0 KiB
Go
99 lines
2.0 KiB
Go
package middleware
|
||
|
||
import (
|
||
"dianshang/pkg/jwt"
|
||
"dianshang/pkg/response"
|
||
"strings"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// AuthMiddleware JWT认证中间件
|
||
func AuthMiddleware() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
token := c.GetHeader("Authorization")
|
||
if token == "" {
|
||
response.Unauthorized(c)
|
||
return
|
||
}
|
||
|
||
// 移除 "Bearer " 前缀
|
||
if strings.HasPrefix(token, "Bearer ") {
|
||
token = token[7:]
|
||
}
|
||
|
||
claims, err := jwt.ParseToken(token)
|
||
if err != nil {
|
||
response.Unauthorized(c)
|
||
return
|
||
}
|
||
|
||
// 将用户信息存储到上下文中
|
||
c.Set("user_id", claims.UserID)
|
||
c.Set("user_type", claims.UserType)
|
||
c.Next()
|
||
}
|
||
}
|
||
|
||
// AdminAuthMiddleware 管理员认证中间件
|
||
func AdminAuthMiddleware() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
token := c.GetHeader("Authorization")
|
||
if token == "" {
|
||
response.Unauthorized(c)
|
||
return
|
||
}
|
||
|
||
// 移除 "Bearer " 前缀
|
||
if strings.HasPrefix(token, "Bearer ") {
|
||
token = token[7:]
|
||
}
|
||
|
||
// 开发环境:支持模拟token
|
||
if strings.HasPrefix(token, "mock_admin_token_") {
|
||
// 模拟管理员用户信息
|
||
c.Set("user_id", uint(1))
|
||
c.Set("user_type", "admin")
|
||
c.Next()
|
||
return
|
||
}
|
||
|
||
claims, err := jwt.ParseToken(token)
|
||
if err != nil {
|
||
response.Unauthorized(c)
|
||
return
|
||
}
|
||
|
||
// 检查用户类型是否为管理员
|
||
if claims.UserType != "admin" {
|
||
response.Forbidden(c)
|
||
return
|
||
}
|
||
|
||
// 将用户信息存储到上下文中
|
||
c.Set("user_id", claims.UserID)
|
||
c.Set("user_type", claims.UserType)
|
||
c.Next()
|
||
}
|
||
}
|
||
|
||
// OptionalAuthMiddleware 可选认证中间件(不强制要求登录)
|
||
func OptionalAuthMiddleware() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
token := c.GetHeader("Authorization")
|
||
if token != "" {
|
||
// 移除 "Bearer " 前缀
|
||
if strings.HasPrefix(token, "Bearer ") {
|
||
token = token[7:]
|
||
}
|
||
|
||
claims, err := jwt.ParseToken(token)
|
||
if err == nil {
|
||
// 将用户信息存储到上下文中
|
||
c.Set("user_id", claims.UserID)
|
||
c.Set("user_type", claims.UserType)
|
||
}
|
||
}
|
||
c.Next()
|
||
}
|
||
} |