增加图形验证码的功能

This commit is contained in:
2026-08-01 00:05:04 +08:00
parent 97450f0739
commit 4f00b83e86
15 changed files with 838 additions and 2 deletions

View File

@@ -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()

View File

@@ -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
}

View File

@@ -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
}
}