feat: Redis cluster support + version auto-detect + metrics API

This commit is contained in:
logan committed 2026-05-30 01:44:58 +08:00
1 parent 8384006ae9
commit 3af65f2350
10 files changed
+485 -66

No files matched your search

+20 -12
View File
@@ -67,9 +67,12 @@ func Login(c *gin.Context) {
c.JSON(http.StatusUnauthorized, gin.H{"detail": "Invalid username or password"})
return
}
// LDAP 认证成功,自动创建本地用户
// LDAP 认证成功,自动创建或恢复本地用户
isActive := true
defaultRole := "developer"
if ldapInfo.DisplayName == "" {
ldapInfo.DisplayName = ldapInfo.Username
}
newUser := model.User{
Username: ldapInfo.Username,
DisplayName: ldapInfo.DisplayName,
@@ -79,20 +82,25 @@ func Login(c *gin.Context) {
Role: defaultRole,
IsActive: &isActive,
}
if newUser.DisplayName == "" {
newUser.DisplayName = newUser.Username
// FirstOrCreate: 不存在则创建,已存在则获取(避免 uniqueIndex 冲突)
result := model.DB.Where("username = ?", ldapInfo.Username).FirstOrCreate(&newUser)
if result.Error != nil {
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Failed to create LDAP user: " + result.Error.Error()})
return
}
if createErr := model.DB.Create(&newUser).Error; createErr != nil {
// 可能并发创建冲突,再查一次
model.DB.Where("username = ?", ldapInfo.Username).First(&user)
if user.ID == 0 {
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Failed to create LDAP user"})
return
// 更新已有用户的 display_name / email(LDAP 信息可能变更)
if newUser.ID != 0 {
updates := map[string]interface{}{
"display_name": ldapInfo.DisplayName,
"auth_source": "ldap",
"is_active": true,
}
} else {
user = newUser
if ldapInfo.Email != nil {
updates["email"] = *ldapInfo.Email
}
model.DB.Model(&newUser).Updates(updates)
}
// 记录 auth_source
user = newUser
} else {
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Database error"})
return