|
|
@@ -9,8 +9,8 @@ import (
|
|
|
"git.ooo.ink/root/go-kit/src/gin/jwtx/db/dao/model"
|
|
|
"git.ooo.ink/root/go-kit/src/gin/jwtx/tool"
|
|
|
"git.ooo.ink/root/go-kit/src/gorm/mysqlx"
|
|
|
+ "git.ooo.ink/root/go-kit/src/logx"
|
|
|
"git.ooo.ink/root/go-kit/src/utilx"
|
|
|
- "github.com/5-say/go-tool/logx"
|
|
|
"github.com/jinzhu/configor"
|
|
|
"gorm.io/gorm"
|
|
|
"gorm.io/gorm/logger"
|
|
|
@@ -18,64 +18,90 @@ import (
|
|
|
_ "embed"
|
|
|
)
|
|
|
|
|
|
-// 初始化分组(支持多次调用)
|
|
|
+// InitGroup 初始化 JWTX 认证分组(支持多次调用,用于多租户场景)
|
|
|
//
|
|
|
-// group string 分组名称
|
|
|
-// configPath string 分组配置文件路径
|
|
|
-// privateKeyPath string 分组私钥文件路径
|
|
|
+// 该函数负责为指定的认证分组进行完整的初始化配置,包括:
|
|
|
+// - 配置文件管理(自动创建默认配置)
|
|
|
+// - 私钥文件管理(自动生成新私钥)
|
|
|
+// - 数据库连接初始化
|
|
|
+// - 数据库表结构迁移
|
|
|
+// - 配置热重载设置
|
|
|
//
|
|
|
-// e.g.
|
|
|
+// 参数说明:
|
|
|
//
|
|
|
-// jwtx.InitGroup("admin", "jwtx/config/admin.yaml", "jwtx/config/admin.key")
|
|
|
-// jwtx.InitGroup("user", "jwtx/config/user.yaml", "jwtx/config/user.key")
|
|
|
+// group string 分组名称 - 认证分组标识(如:"admin", "user", "merchant" 等)
|
|
|
+// configPath string 分组配置文件路径 - YAML 格式的配置文件路径
|
|
|
+// privateKeyPath string 分组私钥文件路径 - PEM 格式的私钥文件路径
|
|
|
+//
|
|
|
+// 返回值:
|
|
|
+//
|
|
|
+// *SingletonT - 返回单例对象,支持链式调用其他方法
|
|
|
+//
|
|
|
+// 注意事项:
|
|
|
+// - 配置文件支持热重载(每秒自动检测更新)
|
|
|
+// - 如果配置文件不存在,会自动创建默认配置
|
|
|
+// - 如果私钥文件不存在,会自动生成新的私钥
|
|
|
+// - 数据库连接使用配置中的 MySQL DSN
|
|
|
+// - 关键步骤失败会 panic,确保系统在正确配置下运行
|
|
|
+//
|
|
|
+// 使用示例:
|
|
|
+//
|
|
|
+// // 初始化管理员认证分组
|
|
|
+// jwtx.InitGroup("admin", "jwtx/config/admin.yaml", "jwtx/config/admin.pem")
|
|
|
+//
|
|
|
+// // 初始化用户认证分组
|
|
|
+// jwtx.InitGroup("user", "jwtx/config/user.yaml", "jwtx/config/user.pem")
|
|
|
+//
|
|
|
+// // 初始化商户认证分组
|
|
|
+// jwtx.InitGroup("merchant", "jwtx/config/merchant.yaml", "jwtx/config/merchant.pem")
|
|
|
func InitGroup(group, configPath, privateKeyPath string) *SingletonT {
|
|
|
- // 配置文件不存在则创建
|
|
|
+ // 配置文件不存在则创建 - 确保配置文件存在,如果不存在会自动创建默认配置
|
|
|
createConfigFileIfNotExist(configPath)
|
|
|
|
|
|
- // 私钥文件不存在则创建
|
|
|
+ // 私钥文件不存在则创建 - 确保私钥文件存在,如果不存在会自动生成新的私钥
|
|
|
createKeyFileIfNotExist(privateKeyPath)
|
|
|
|
|
|
- // 取得单例
|
|
|
+ // 取得单例 - 如果全局单例对象尚未初始化,则进行初始化
|
|
|
if Singleton == nil {
|
|
|
Singleton = &SingletonT{}
|
|
|
- Singleton.DB = make(map[string]*gorm.DB)
|
|
|
- Singleton.Config = make(map[string]GroupConfig)
|
|
|
- Singleton.PrivateKey = make(map[string]ed25519.PrivateKey)
|
|
|
+ Singleton.DB = make(map[string]*gorm.DB) // 初始化数据库连接映射,按分组存储
|
|
|
+ Singleton.Config = make(map[string]GroupConfig) // 初始化配置映射,按分组存储
|
|
|
+ Singleton.PrivateKey = make(map[string]ed25519.PrivateKey) // 初始化私钥映射,按分组存储
|
|
|
}
|
|
|
|
|
|
- // 引用简化
|
|
|
+ // 引用简化 - 使用局部变量简化代码书写
|
|
|
var s = Singleton
|
|
|
|
|
|
- // 初始化分组配置,每秒自动更新
|
|
|
+ // 初始化分组配置,每秒自动更新 - 使用 configor 库加载配置文件,支持热重载
|
|
|
var config GroupConfig
|
|
|
err := configor.New(&configor.Config{AutoReload: true}).Load(&config, configPath)
|
|
|
if err != nil {
|
|
|
- panic(err)
|
|
|
+ panic(err) // 配置文件加载失败,系统无法正常运行
|
|
|
}
|
|
|
- s.Config[group] = config
|
|
|
+ s.Config[group] = config // 将配置存储到对应分组
|
|
|
|
|
|
- // 初始化分组数据库连接
|
|
|
+ // 初始化分组数据库连接 - 根据配置中的 MySQL DSN 创建数据库连接
|
|
|
s.DB[group], err = mysqlx.New(config.MysqlDSN, logx.GormLogger(logger.Config{
|
|
|
- SlowThreshold: 200 * time.Millisecond,
|
|
|
- IgnoreRecordNotFoundError: false,
|
|
|
- ParameterizedQueries: false,
|
|
|
- LogLevel: logger.Warn,
|
|
|
+ SlowThreshold: 200 * time.Millisecond, // 慢查询阈值:200毫秒
|
|
|
+ IgnoreRecordNotFoundError: false, // 不忽略记录未找到错误
|
|
|
+ ParameterizedQueries: false, // 不使用参数化查询
|
|
|
+ LogLevel: logger.Warn, // 日志级别:警告
|
|
|
}))
|
|
|
if err != nil {
|
|
|
- panic(err)
|
|
|
+ panic(err) // 数据库连接失败,系统无法正常运行
|
|
|
}
|
|
|
|
|
|
- // 初始化数据库结构
|
|
|
+ // 初始化数据库结构 - 自动创建或更新 JWT token 表结构
|
|
|
s.DB[group].AutoMigrate(&model.JwtxToken{})
|
|
|
|
|
|
- // 初始化分组私钥
|
|
|
+ // 初始化分组私钥 - 从文件加载私钥用于 JWT token 签名
|
|
|
privateKey, err := tool.GetPrivateKey(privateKeyPath)
|
|
|
if err != nil {
|
|
|
- panic(err)
|
|
|
+ panic(err) // 私钥加载失败,系统无法正常运行
|
|
|
}
|
|
|
- s.PrivateKey[group] = *privateKey
|
|
|
+ s.PrivateKey[group] = *privateKey // 将私钥存储到对应分组
|
|
|
|
|
|
- return s
|
|
|
+ return s // 返回单例对象,便于链式调用
|
|
|
}
|
|
|
|
|
|
//go:embed example/demo.yaml
|