feat(sms): 新增节点短信提醒(审核未通过/被租用需辅助/上架未成交)
This commit is contained in:
@@ -11,7 +11,8 @@ import (
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func newSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provider {
|
||||
// NewSMSProvider 构造主站短信通道,供路由装配与后台任务(节点短信派发)共用。
|
||||
func NewSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provider {
|
||||
switch strings.ToLower(strings.TrimSpace(cfg.SMS.Provider)) {
|
||||
case "aliyun":
|
||||
provider, err := smsintegration.NewAliyunProvider(smsintegration.AliyunConfig{
|
||||
@@ -31,6 +32,47 @@ func newSMSProvider(cfg config.Config, logger *zap.Logger) smsintegration.Provid
|
||||
}
|
||||
}
|
||||
|
||||
// NewFieldEncryptor 构造业务字段加密器(实名、收款账号、分站短信密钥共用)。
|
||||
// 主密钥与 legacy 回退并存,保证密钥轮换期间仍能解出旧密文。
|
||||
func NewFieldEncryptor(cfg config.Config, logger *zap.Logger) crypto.Encryptor {
|
||||
var fieldEncryptor crypto.Encryptor
|
||||
primary := cfg.FieldEncryptionKey
|
||||
legacy := cfg.FieldEncryptionLegacyKey
|
||||
switch {
|
||||
case primary != "":
|
||||
encryptor, err := crypto.NewFieldEncryptor(primary, legacy)
|
||||
if err != nil {
|
||||
if config.IsProductionEnv(cfg.AppEnv) {
|
||||
logger.Fatal("业务字段加密密钥无效", zap.Error(err))
|
||||
}
|
||||
logger.Warn("业务字段加密密钥无效,已回退旧密钥", zap.Error(err))
|
||||
// primary 非法时退回 legacy 单密钥(若有),否则 MockEncryptor
|
||||
if legacy != "" {
|
||||
if e, eErr := crypto.NewFieldEncryptor(legacy); eErr == nil {
|
||||
fieldEncryptor = e
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fieldEncryptor = encryptor
|
||||
}
|
||||
case legacy != "":
|
||||
// 开发态零配置:用 legacy 单密钥,能解历史存量密文。
|
||||
encryptor, err := crypto.NewFieldEncryptor(legacy)
|
||||
if err == nil {
|
||||
fieldEncryptor = encryptor
|
||||
logger.Debug("开发环境使用旧业务字段加密密钥")
|
||||
}
|
||||
}
|
||||
if fieldEncryptor == nil {
|
||||
if config.IsProductionEnv(cfg.AppEnv) {
|
||||
logger.Fatal("业务字段加密密钥未设置")
|
||||
}
|
||||
fieldEncryptor = &crypto.MockEncryptor{}
|
||||
logger.Debug("开发环境使用模拟业务字段加密器")
|
||||
}
|
||||
return fieldEncryptor
|
||||
}
|
||||
|
||||
func newRealnameProvider(cfg config.Config, encryptor crypto.Encryptor, logger *zap.Logger) realname.Provider {
|
||||
switch strings.ToLower(strings.TrimSpace(cfg.Realname.Provider)) {
|
||||
case "cloudmarket", "aliyun_cloudmarket":
|
||||
|
||||
@@ -42,7 +42,6 @@ import (
|
||||
"hfb_sys/backend/internal/modules/withdrawal"
|
||||
|
||||
_ "hfb_sys/backend/docs" // Swagger 文档
|
||||
"hfb_sys/backend/pkg/crypto"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
swaggerFiles "github.com/swaggo/files"
|
||||
@@ -76,51 +75,15 @@ func New(cfg config.Config, deps Dependencies, logger *zap.Logger) *gin.Engine {
|
||||
engine.Use(middleware.AdminAwareRateLimitPerMinute(cfg.RateLimit.RequestsPerMinute, deps.Redis, jwtManager))
|
||||
}
|
||||
|
||||
// 业务字段加密器(实名/收款账号):主密钥 + legacy 回退,用于密钥轮换期间透明解出旧密文。
|
||||
// 业务字段加密器(实名/收款账号/分站短信密钥):主密钥 + legacy 回退,用于密钥轮换期间透明解出旧密文。
|
||||
// 生产环境必须配置 FIELD_ENCRYPTION_KEY(ValidateProductionSecurity 已校验)。
|
||||
// 开发/测试缺 FIELD_ENCRYPTION_KEY 时用 legacy 密钥构造单密钥加密器,
|
||||
// 保证零配置兼容历史硬编码密钥加密的存量密文(非生产 legacy 默认填历史硬编码值)。
|
||||
var fieldEncryptor crypto.Encryptor
|
||||
primary := cfg.FieldEncryptionKey
|
||||
legacy := cfg.FieldEncryptionLegacyKey
|
||||
switch {
|
||||
case primary != "":
|
||||
encryptor, err := crypto.NewFieldEncryptor(primary, legacy)
|
||||
if err != nil {
|
||||
if config.IsProductionEnv(cfg.AppEnv) {
|
||||
logger.Fatal("业务字段加密密钥无效", zap.Error(err))
|
||||
}
|
||||
logger.Warn("业务字段加密密钥无效,已回退旧密钥", zap.Error(err))
|
||||
// primary 非法时退回 legacy 单密钥(若有),否则 MockEncryptor
|
||||
if legacy != "" {
|
||||
if e, eErr := crypto.NewFieldEncryptor(legacy); eErr == nil {
|
||||
fieldEncryptor = e
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fieldEncryptor = encryptor
|
||||
}
|
||||
case legacy != "":
|
||||
// 开发态零配置:用 legacy 单密钥,能解历史存量密文。
|
||||
encryptor, err := crypto.NewFieldEncryptor(legacy)
|
||||
if err == nil {
|
||||
fieldEncryptor = encryptor
|
||||
logger.Debug("开发环境使用旧业务字段加密密钥")
|
||||
}
|
||||
}
|
||||
if fieldEncryptor == nil {
|
||||
if config.IsProductionEnv(cfg.AppEnv) {
|
||||
logger.Fatal("业务字段加密密钥未设置")
|
||||
}
|
||||
fieldEncryptor = &crypto.MockEncryptor{}
|
||||
logger.Debug("开发环境使用模拟业务字段加密器")
|
||||
}
|
||||
fieldEncryptor := NewFieldEncryptor(cfg, logger)
|
||||
|
||||
var userRepo *auth.UserRepository
|
||||
if deps.DB != nil {
|
||||
userRepo = auth.NewUserRepository(deps.DB)
|
||||
}
|
||||
smsProvider := newSMSProvider(cfg, logger)
|
||||
smsProvider := NewSMSProvider(cfg, logger)
|
||||
authService := auth.NewService(userRepo, deps.Redis, jwtManager, smsProvider, logger)
|
||||
authHandler := auth.NewHandler(authService)
|
||||
var adminAuthRepo *adminauth.Repository
|
||||
|
||||
Reference in New Issue
Block a user