增加图形验证码的功能
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.toowon.com/jimmy/go-common/captcha"
|
||||
"git.toowon.com/jimmy/go-common/config"
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/excel"
|
||||
@@ -42,6 +43,7 @@ type Factory struct {
|
||||
i18n *i18n.I18n
|
||||
chain *middleware.Chain
|
||||
mcp mcp.Manager
|
||||
captcha captcha.Manager
|
||||
|
||||
mu sync.Mutex
|
||||
}
|
||||
@@ -437,6 +439,41 @@ func (f *Factory) MCP() (mcp.Manager, error) {
|
||||
return f.getMCP()
|
||||
}
|
||||
|
||||
func (f *Factory) getCaptcha() (captcha.Manager, error) {
|
||||
if f.captcha != nil {
|
||||
return f.captcha, nil
|
||||
}
|
||||
|
||||
var cfg *config.CaptchaConfig
|
||||
if f.cfg != nil {
|
||||
cfg = f.cfg.Captcha
|
||||
}
|
||||
|
||||
var rdb *redis.Client
|
||||
if cfg != nil && cfg.Enabled {
|
||||
var err error
|
||||
rdb, err = f.getRedis()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("captcha enabled but redis unavailable: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
f.mu.Lock()
|
||||
defer f.mu.Unlock()
|
||||
if f.captcha != nil {
|
||||
return f.captcha, nil
|
||||
}
|
||||
f.captcha = captcha.NewManager(rdb, cfg)
|
||||
return f.captcha, nil
|
||||
}
|
||||
|
||||
// Captcha 获取图形验证码子系统(Generate / Verify / 登录防暴力)。
|
||||
// config.captcha 未配置或 enabled=false 时返回 Enabled()=false 的安全实例。
|
||||
// enabled=true 时需配置 redis,否则返回 error。
|
||||
func (f *Factory) Captcha() (captcha.Manager, error) {
|
||||
return f.getCaptcha()
|
||||
}
|
||||
|
||||
// Migrator 创建迁移器并加载指定目录下的 SQL 文件
|
||||
func (f *Factory) Migrator(migrationsDir string) (*migration.Migrator, error) {
|
||||
db, err := f.getDatabase()
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"git.toowon.com/jimmy/go-common/captcha"
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/i18n"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
@@ -26,6 +27,7 @@ const (
|
||||
ModuleSMS Module = "sms"
|
||||
ModuleI18n Module = "i18n"
|
||||
ModuleMCP Module = "mcp"
|
||||
ModuleCaptcha Module = "captcha"
|
||||
)
|
||||
|
||||
// MustInit 从配置文件初始化全局 Factory;失败则 panic(适合 main 启动)
|
||||
@@ -60,6 +62,8 @@ func (f *Factory) Warmup(modules ...Module) error {
|
||||
_, err = f.I18n()
|
||||
case ModuleMCP:
|
||||
_, err = f.MCP()
|
||||
case ModuleCaptcha:
|
||||
_, err = f.Captcha()
|
||||
default:
|
||||
return fmt.Errorf("unknown module: %s", m)
|
||||
}
|
||||
@@ -198,3 +202,12 @@ func (f *Factory) MustMCP() mcp.Manager {
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
// MustCaptcha 获取图形验证码子系统对象;失败则 panic(适合启动期注入)
|
||||
func (f *Factory) MustCaptcha() captcha.Manager {
|
||||
c, err := f.Captcha()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package factory
|
||||
|
||||
import (
|
||||
"git.toowon.com/jimmy/go-common/captcha"
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/i18n"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
@@ -74,3 +75,10 @@ func WithMCP(m mcp.Manager) Option {
|
||||
f.mcp = m
|
||||
}
|
||||
}
|
||||
|
||||
// WithCaptcha 注入自定义图形验证码实现(如测试用的 fake 实现)
|
||||
func WithCaptcha(c captcha.Manager) Option {
|
||||
return func(f *Factory) {
|
||||
f.captcha = c
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user