修修复 因为secure导致的登录失败问题

修复 安装拦截器部分情况下失效的问题
This commit is contained in:
2026-03-31 02:14:08 +08:00
parent 16b4f0a0be
commit 3293fc452a
5 changed files with 74 additions and 50 deletions

View File

@@ -131,6 +131,7 @@ func LoginHandler(c *gin.Context) {
"avatar": user.Avatar,
"nickname": user.Nickname,
"username": user.Username,
"token": token,
})
}
@@ -308,9 +309,21 @@ func parseJWTToken(tokenString string) (*JWTClaims, error) {
return nil, fmt.Errorf("invalid token")
}
// getJWTCookie 获取JWT cookie的通用函数
// getJWTCookie 获取JWT cookie的通用函数支持从Cookie或Authorization Header中获取
func getJWTCookie(c *gin.Context) (string, error) {
return c.Cookie("admin_session")
cookie, err := c.Cookie("admin_session")
if err == nil && cookie != "" {
return cookie, nil
}
// 如果Cookie中没有尝试从Authorization Header中获取 (兼容前端在非HTTPS环境下无法设置Secure Cookie的情况)
authHeader := c.GetHeader("Authorization")
if authHeader != "" && strings.HasPrefix(authHeader, "Bearer ") {
token := strings.TrimPrefix(authHeader, "Bearer ")
return token, nil
}
return "", fmt.Errorf("未找到会话信息")
}
// validateAdminPasswordHash 验证管理员密码哈希的通用函数
@@ -367,13 +380,23 @@ func IsAdminAuthenticated(c *gin.Context) bool {
// IsAdminAuthenticatedHttp 判断管理员是否已认证HTTP兼容版本
// 保留此方法以兼容未迁移的 Handler
func IsAdminAuthenticatedHttp(r *http.Request) bool {
token := ""
cookie, err := r.Cookie("admin_session")
if err != nil || cookie.Value == "" {
if err == nil && cookie.Value != "" {
token = cookie.Value
} else {
authHeader := r.Header.Get("Authorization")
if authHeader != "" && strings.HasPrefix(authHeader, "Bearer ") {
token = strings.TrimPrefix(authHeader, "Bearer ")
}
}
if token == "" {
return false
}
// 解析并验证JWT令牌
claims, err := parseJWTToken(cookie.Value)
claims, err := parseJWTToken(token)
if err != nil {
return false
}
@@ -431,12 +454,22 @@ func IsAdminAuthenticatedWithCleanup(c *gin.Context) bool {
// GetCurrentAdminUser 获取当前登录的管理员用户信息 (HTTP 兼容版)
func GetCurrentAdminUser(r *http.Request) (*JWTClaims, error) {
token := ""
cookie, err := r.Cookie("admin_session")
if err != nil {
if err == nil && cookie.Value != "" {
token = cookie.Value
} else {
authHeader := r.Header.Get("Authorization")
if authHeader != "" && strings.HasPrefix(authHeader, "Bearer ") {
token = strings.TrimPrefix(authHeader, "Bearer ")
}
}
if token == "" {
return nil, fmt.Errorf("未找到会话信息")
}
claims, err := parseJWTToken(cookie.Value)
claims, err := parseJWTToken(token)
if err != nil {
return nil, fmt.Errorf("无效的会话信息")
}

View File

@@ -11,6 +11,7 @@ import (
"strings"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
@@ -165,5 +166,15 @@ func InstallSubmitHandler(c *gin.Context) {
// 5. 更新内存缓存
services.ResetSettingsService()
// 6. 动态初始化核心组件
// 在系统安装完成后,执行本来在 server.go 中需要已安装才能执行的初始化逻辑
encryptionKey := services.GetSettingsService().GetEncryptionKey()
if err := utils.InitEncryption(encryptionKey); err != nil {
logrus.WithError(err).Error("安装完成后加密管理器初始化失败")
}
// 启动日志清理定时任务
services.StartLogCleanupTask()
c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "安装成功"})
}