Files
Quincy_admin/middle/middle_auth.go
2026-03-26 22:13:03 +08:00

98 lines
2.1 KiB
Go
Raw Permalink 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 middle auth_middleware.go
package middle
import (
"Quincy_admin/utils"
"net/http"
"github.com/gin-gonic/gin"
)
type AuthMiddleware struct {
Service *MService
}
func NewAuthMiddleware(Service *MService) *AuthMiddleware {
return &AuthMiddleware{
Service: Service,
}
}
// Auth 验证 X-Access-Token 的中间件
func (m *AuthMiddleware) Auth() gin.HandlerFunc {
return func(ctx *gin.Context) {
// 获取 X-Access-Token 头部
token := ctx.GetHeader("Authorization")
if token == "" {
utils.Error(ctx, http.StatusUnauthorized, "缺少访问令牌")
ctx.Abort()
return
}
user, err := utils.ParseToken(token)
if err != nil {
utils.Error(ctx, http.StatusUnauthorized, "无效的访问令牌")
ctx.Abort()
return
}
// 验证用户是否存在
newUser, err := m.Service.GetUserID(user.SessionCode)
if err != nil {
utils.Error(ctx, http.StatusUnauthorized, "用户不存在")
ctx.Abort()
return
}
if newUser.Status != 1 {
utils.Error(ctx, http.StatusUnauthorized, "用户已被锁定")
ctx.Abort()
return
}
// 使用 ctx.Set() 存储用户 ID角色ID供后续中间件读取
ctx.Set("user_id", newUser.ID)
ctx.Set("role_id", newUser.RoleCode)
ctx.Set("code", newUser.SessionCode)
// token 验证成功,继续处理请求
ctx.Next()
}
}
// Perm 验证权限
func (m *AuthMiddleware) Perm(perm string) gin.HandlerFunc {
return func(ctx *gin.Context) {
userIDInterface, exists := ctx.Get("user_id")
if !exists {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID不存在")
ctx.Abort()
return
}
userID, ok := userIDInterface.(int)
if !ok {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID类型错误")
ctx.Abort()
return
}
// 检查是否为超级管理员,如果是则跳过权限校验
if m.Service.IsSuperAdmin(userID) {
ctx.Next()
return
}
// 非超管账号检查权限
if err := m.Service.HasPermission(userID, perm); err != nil {
utils.Error(ctx, http.StatusForbidden, "没有权限")
ctx.Abort()
return
}
ctx.Next()
}
}