feat(auth): 新增系统启动时自动初始化默认超级管理员功能
- 新增默认管理员自动初始化逻辑,系统启动时检查并创建超级管理员账号 - 支持通过配置文件自定义账号信息(优先级:配置文件 > 代码默认值) - 新增 CreateSystemAccount 方法用于系统内部账号创建 - 新增默认管理员配置项和常量定义 - 更新 README.md 添加默认账号使用说明 - 归档 OpenSpec 变更提案及完整文档 相关文件: - internal/bootstrap/admin.go: 管理员初始化逻辑 - internal/service/account/service.go: 系统账号创建方法 - pkg/config/config.go: 默认管理员配置结构 - pkg/constants/constants.go: 默认值常量定义 - docs/add-default-admin-init/功能说明.md: 完整功能文档
This commit is contained in:
@@ -343,3 +343,38 @@ func (s *Service) ValidatePassword(plainPassword, hashedPassword string) bool {
|
||||
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(plainPassword))
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// CreateSystemAccount 系统内部创建账号方法,用于系统初始化场景(绕过当前用户检查)
|
||||
func (s *Service) CreateSystemAccount(ctx context.Context, account *model.Account) error {
|
||||
if account.Username == "" {
|
||||
return errors.New(errors.CodeInvalidParam, "用户名不能为空")
|
||||
}
|
||||
if account.Phone == "" {
|
||||
return errors.New(errors.CodeInvalidParam, "手机号不能为空")
|
||||
}
|
||||
if account.Password == "" {
|
||||
return errors.New(errors.CodeInvalidParam, "密码不能为空")
|
||||
}
|
||||
|
||||
existing, err := s.accountStore.GetByUsername(ctx, account.Username)
|
||||
if err == nil && existing != nil {
|
||||
return errors.New(errors.CodeUsernameExists, "用户名已存在")
|
||||
}
|
||||
|
||||
existing, err = s.accountStore.GetByPhone(ctx, account.Phone)
|
||||
if err == nil && existing != nil {
|
||||
return errors.New(errors.CodePhoneExists, "手机号已存在")
|
||||
}
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(account.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return fmt.Errorf("密码哈希失败: %w", err)
|
||||
}
|
||||
account.Password = string(hashedPassword)
|
||||
|
||||
if err := s.accountStore.Create(ctx, account); err != nil {
|
||||
return fmt.Errorf("创建账号失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user