From c421123ab6e00a4f089d11cf784c0778e0543e70 Mon Sep 17 00:00:00 2001 From: tbphp Date: Thu, 24 Jul 2025 21:53:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=93=E5=AD=98=E4=BB=A3=E7=90=86key?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/config/system_settings.go | 2 ++ internal/handler/settings_handler.go | 9 +++++++++ internal/middleware/middleware.go | 12 ++++-------- internal/models/types.go | 3 +++ internal/services/group_manager.go | 2 ++ internal/types/types.go | 3 +++ internal/utils/config_utils.go | 2 +- internal/utils/string_utils.go | 14 ++++++++++++++ 8 files changed, 38 insertions(+), 9 deletions(-) diff --git a/internal/config/system_settings.go b/internal/config/system_settings.go index 58aecb7..83b42c3 100644 --- a/internal/config/system_settings.go +++ b/internal/config/system_settings.go @@ -73,6 +73,8 @@ func (sm *SystemSettingsManager) Initialize(store store.Store, gm groupManager, } } + settings.ProxyKeysMap = utils.StringToSet(settings.ProxyKeys, ",") + sm.DisplaySystemConfig(settings) return settings, nil diff --git a/internal/handler/settings_handler.go b/internal/handler/settings_handler.go index 47fd3d6..f347912 100644 --- a/internal/handler/settings_handler.go +++ b/internal/handler/settings_handler.go @@ -5,6 +5,7 @@ import ( "gpt-load/internal/models" "gpt-load/internal/response" "gpt-load/internal/utils" + "strings" "time" "github.com/gin-gonic/gin" @@ -51,6 +52,14 @@ func (s *Server) UpdateSettings(c *gin.Context) { return } + // Sanitize proxy_keys input + if proxyKeys, ok := settingsMap["proxy_keys"]; ok { + if proxyKeysStr, ok := proxyKeys.(string); ok { + cleanedKeys := utils.SplitAndTrim(proxyKeysStr, ",") + settingsMap["proxy_keys"] = strings.Join(cleanedKeys, ",") + } + } + // 更新配置 if err := s.SettingsManager.UpdateSettings(settingsMap); err != nil { response.Error(c, app_errors.NewAPIError(app_errors.ErrDatabase, err.Error())) diff --git a/internal/middleware/middleware.go b/internal/middleware/middleware.go index a3a971e..69c313d 100644 --- a/internal/middleware/middleware.go +++ b/internal/middleware/middleware.go @@ -3,7 +3,6 @@ package middleware import ( "fmt" - "slices" "strings" "time" @@ -11,7 +10,6 @@ import ( "gpt-load/internal/response" "gpt-load/internal/services" "gpt-load/internal/types" - "gpt-load/internal/utils" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" @@ -156,16 +154,14 @@ func ProxyAuth(gm *services.GroupManager) gin.HandlerFunc { return } - // Check Group keys first - groupKeys := utils.SplitAndTrim(group.ProxyKeys, ",") - if slices.Contains(groupKeys, key) { + // Then check System-wide keys (O(1) lookup) + if _, ok := group.EffectiveConfig.ProxyKeysMap[key]; ok { c.Next() return } - // Then check System-wide keys - systemKeys := utils.SplitAndTrim(group.EffectiveConfig.ProxyKeys, ",") - if slices.Contains(systemKeys, key) { + // Check Group keys first (O(1) lookup) + if _, ok := group.ProxyKeysMap[key]; ok { c.Next() return } diff --git a/internal/models/types.go b/internal/models/types.go index 90c156c..e8bc878 100644 --- a/internal/models/types.go +++ b/internal/models/types.go @@ -58,6 +58,9 @@ type Group struct { LastValidatedAt *time.Time `json:"last_validated_at"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` + + // For cache + ProxyKeysMap map[string]struct{} `gorm:"-" json:"-"` } // APIKey 对应 api_keys 表 diff --git a/internal/services/group_manager.go b/internal/services/group_manager.go index 840ac8a..42fd9b3 100644 --- a/internal/services/group_manager.go +++ b/internal/services/group_manager.go @@ -7,6 +7,7 @@ import ( "gpt-load/internal/models" "gpt-load/internal/store" "gpt-load/internal/syncer" + "gpt-load/internal/utils" "github.com/sirupsen/logrus" "gorm.io/gorm" @@ -47,6 +48,7 @@ func (gm *GroupManager) Initialize() error { for _, group := range groups { g := *group g.EffectiveConfig = gm.settingsManager.GetEffectiveConfig(g.Config) + g.ProxyKeysMap = utils.StringToSet(g.ProxyKeys, ",") groupMap[g.Name] = &g logrus.WithFields(logrus.Fields{ "group_name": g.Name, diff --git a/internal/types/types.go b/internal/types/types.go index abafa12..122b877 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -37,6 +37,9 @@ type SystemSettings struct { KeyValidationIntervalMinutes int `json:"key_validation_interval_minutes" default:"60" name:"密钥验证间隔(分钟)" category:"密钥配置" desc:"后台验证密钥的默认间隔(分钟)。" validate:"min=30"` KeyValidationConcurrency int `json:"key_validation_concurrency" default:"10" name:"密钥验证并发数" category:"密钥配置" desc:"后台定时验证无效 Key 时的并发数。" validate:"min=1"` KeyValidationTimeoutSeconds int `json:"key_validation_timeout_seconds" default:"20" name:"密钥验证超时(秒)" category:"密钥配置" desc:"后台定时验证单个 Key 时的 API 请求超时时间(秒)。" validate:"min=5"` + + // For cache + ProxyKeysMap map[string]struct{} `json:"-"` } // ServerConfig represents server configuration diff --git a/internal/utils/config_utils.go b/internal/utils/config_utils.go index 9e3ed3c..8fa2369 100644 --- a/internal/utils/config_utils.go +++ b/internal/utils/config_utils.go @@ -23,7 +23,7 @@ func GenerateSettingsMetadata(s *types.SystemSettings) []models.SystemSettingInf fieldValue := v.Field(i) jsonTag := field.Tag.Get("json") - if jsonTag == "" { + if jsonTag == "" || jsonTag == "-" { continue } diff --git a/internal/utils/string_utils.go b/internal/utils/string_utils.go index ebf4ad7..364b2b9 100644 --- a/internal/utils/string_utils.go +++ b/internal/utils/string_utils.go @@ -40,3 +40,17 @@ func SplitAndTrim(s string, sep string) []string { return result } + +// StringToSet converts a separator-delimited string into a set +func StringToSet(s string, sep string) map[string]struct{} { + parts := SplitAndTrim(s, sep) + if len(parts) == 0 { + return nil + } + + set := make(map[string]struct{}, len(parts)) + for _, part := range parts { + set[part] = struct{}{} + } + return set +}