feat(security): 启动时自动迁移并持久化JWT密钥
- 新增 security_secrets 表及 Ent schema 用于存储系统级密钥 - 启动阶段支持无 jwt.secret 配置并在数据库中自动生成持久化 - 在 Ent 初始化后补齐密钥并执行完整配置校验 - 增加并发与异常分支单元测试,覆盖密钥引导核心路径 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/Wei-Shaw/sub2api/ent/proxy"
|
||||
"github.com/Wei-Shaw/sub2api/ent/redeemcode"
|
||||
"github.com/Wei-Shaw/sub2api/ent/schema"
|
||||
"github.com/Wei-Shaw/sub2api/ent/securitysecret"
|
||||
"github.com/Wei-Shaw/sub2api/ent/setting"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usagecleanuptask"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usagelog"
|
||||
@@ -598,6 +599,43 @@ func init() {
|
||||
redeemcodeDescValidityDays := redeemcodeFields[9].Descriptor()
|
||||
// redeemcode.DefaultValidityDays holds the default value on creation for the validity_days field.
|
||||
redeemcode.DefaultValidityDays = redeemcodeDescValidityDays.Default.(int)
|
||||
securitysecretMixin := schema.SecuritySecret{}.Mixin()
|
||||
securitysecretMixinFields0 := securitysecretMixin[0].Fields()
|
||||
_ = securitysecretMixinFields0
|
||||
securitysecretFields := schema.SecuritySecret{}.Fields()
|
||||
_ = securitysecretFields
|
||||
// securitysecretDescCreatedAt is the schema descriptor for created_at field.
|
||||
securitysecretDescCreatedAt := securitysecretMixinFields0[0].Descriptor()
|
||||
// securitysecret.DefaultCreatedAt holds the default value on creation for the created_at field.
|
||||
securitysecret.DefaultCreatedAt = securitysecretDescCreatedAt.Default.(func() time.Time)
|
||||
// securitysecretDescUpdatedAt is the schema descriptor for updated_at field.
|
||||
securitysecretDescUpdatedAt := securitysecretMixinFields0[1].Descriptor()
|
||||
// securitysecret.DefaultUpdatedAt holds the default value on creation for the updated_at field.
|
||||
securitysecret.DefaultUpdatedAt = securitysecretDescUpdatedAt.Default.(func() time.Time)
|
||||
// securitysecret.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field.
|
||||
securitysecret.UpdateDefaultUpdatedAt = securitysecretDescUpdatedAt.UpdateDefault.(func() time.Time)
|
||||
// securitysecretDescKey is the schema descriptor for key field.
|
||||
securitysecretDescKey := securitysecretFields[0].Descriptor()
|
||||
// securitysecret.KeyValidator is a validator for the "key" field. It is called by the builders before save.
|
||||
securitysecret.KeyValidator = func() func(string) error {
|
||||
validators := securitysecretDescKey.Validators
|
||||
fns := [...]func(string) error{
|
||||
validators[0].(func(string) error),
|
||||
validators[1].(func(string) error),
|
||||
}
|
||||
return func(key string) error {
|
||||
for _, fn := range fns {
|
||||
if err := fn(key); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}()
|
||||
// securitysecretDescValue is the schema descriptor for value field.
|
||||
securitysecretDescValue := securitysecretFields[1].Descriptor()
|
||||
// securitysecret.ValueValidator is a validator for the "value" field. It is called by the builders before save.
|
||||
securitysecret.ValueValidator = securitysecretDescValue.Validators[0].(func(string) error)
|
||||
settingFields := schema.Setting{}.Fields()
|
||||
_ = settingFields
|
||||
// settingDescKey is the schema descriptor for key field.
|
||||
|
||||
Reference in New Issue
Block a user