5.2 KiB
5.2 KiB
用户种子数据(Seeder)使用说明
概述
本项目提供了两种创建初始管理员用户的方式:
- SQL 脚本方式 (
init-admin-user.sql) - 手动执行 SQL - Seeder 方式 (
user.seeder.ts) - 应用启动时自动执行(推荐)
方式对比
SQL 脚本方式
优点:
- ✅ 简单直接,适合快速初始化
- ✅ 不依赖应用代码,可以在应用启动前执行
- ✅ 适合数据库迁移场景
- ✅ 可以批量创建多个用户
缺点:
- ❌ 需要手动执行,容易忘记
- ❌ 密码哈希需要提前生成
- ❌ 不便于版本控制(如果修改需要更新 SQL)
- ❌ 无法使用业务逻辑验证
适用场景:
- 数据库迁移脚本
- 一次性初始化
- 生产环境手动创建用户
Seeder 方式(推荐)
优点:
- ✅ 代码化管理,版本控制友好
- ✅ 自动执行,无需手动操作
- ✅ 可以使用业务逻辑(密码加密、验证等)
- ✅ 环境变量配置,灵活性强
- ✅ 幂等性:如果用户已存在,不会重复创建
- ✅ 可以集成到 CI/CD 流程
缺点:
- ❌ 需要应用启动后才能执行
- ❌ 如果应用启动失败,无法创建用户
适用场景:
- 开发/测试环境自动初始化
- 新环境部署
- 需要动态配置的场景
使用方式
方式1:Seeder 自动创建(推荐)
1. 配置环境变量
在 .env 或 .env.development 文件中添加:
# 启用用户种子数据(生产环境默认关闭)
ENABLE_USER_SEEDER=true
# 管理员用户配置(可选,有默认值)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_EMAIL=admin@vestmind.com
ADMIN_NICKNAME=系统管理员
ADMIN_ROLE=admin
2. 确保 UserSeeder 已注册
在 user.module.ts 中,UserSeeder 应该已经在 providers 中:
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserService, UserSeeder], // 确保包含 UserSeeder
// ...
})
3. 启动应用
pnpm start:dev
应用启动时会自动检查并创建管理员用户(如果不存在)。
方式2:SQL 脚本手动创建
1. 生成密码哈希(如果需要修改密码)
node src/modules/user/generate-password-hash.js your_password
2. 修改 SQL 文件
编辑 init-admin-user.sql,更新密码哈希值。
3. 执行 SQL
psql -U postgres -d your_database -f src/modules/user/init-admin-user.sql
环境配置说明
开发环境
# .env.development
ENABLE_USER_SEEDER=true
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_EMAIL=admin@vestmind.com
测试环境
# .env.test
ENABLE_USER_SEEDER=true
ADMIN_USERNAME=test_admin
ADMIN_PASSWORD=test_password_123
ADMIN_EMAIL=test@vestmind.com
生产环境
推荐做法:
-
方式1:手动创建(最安全)
- 使用 SQL 脚本手动创建
- 或通过管理后台创建
- 不启用自动 Seeder
-
方式2:首次部署时启用
# .env.production(仅首次部署时) ENABLE_USER_SEEDER=true ADMIN_PASSWORD=强密码创建完成后,移除
ENABLE_USER_SEEDER或设置为false
最佳实践建议
1. 开发环境
- ✅ 使用 Seeder 自动创建
- ✅ 使用简单的默认密码(如 admin123)
- ✅ 在 README 中说明默认账号密码
2. 测试环境
- ✅ 使用 Seeder 自动创建
- ✅ 使用测试专用的账号密码
- ✅ 可以通过环境变量灵活配置
3. 生产环境
- ⚠️ 不推荐自动创建(安全考虑)
- ✅ 使用 SQL 脚本手动创建
- ✅ 或通过管理后台首次创建
- ✅ 使用强密码
- ✅ 创建后立即修改密码
4. Docker/容器部署
- ✅ 可以在启动脚本中执行 SQL
- ✅ 或使用初始化容器执行 Seeder
- ✅ 确保只执行一次(幂等性)
安全建议
-
密码安全
- 生产环境必须使用强密码
- 不要在代码中硬编码密码
- 使用环境变量或密钥管理服务
-
权限控制
- 生产环境默认不启用自动创建
- 通过环境变量显式控制
-
审计日志
- 记录管理员用户的创建时间
- 记录创建来源(Seeder/SQL/手动)
-
定期检查
- 定期检查管理员账号
- 删除未使用的测试账号
故障排查
Seeder 未执行
- 检查
UserSeeder是否在user.module.ts的providers中 - 检查环境变量
ENABLE_USER_SEEDER是否设置为true - 检查日志输出,查看是否有错误信息
用户已存在但想重新创建
- 删除现有用户:
DELETE FROM "users" WHERE username = 'admin'; - 重启应用,Seeder 会自动创建
修改管理员密码
- 使用
generate-password-hash.js生成新密码哈希 - 更新数据库:
UPDATE "users" SET password_hash = '$2b$10$新的哈希值', updated_at = NOW() WHERE username = 'admin';
总结
- 开发/测试环境:推荐使用 Seeder,自动化程度高
- 生产环境:推荐使用 SQL 脚本或管理后台,更安全可控
- 两种方式可以并存:SQL 作为备用方案,Seeder 作为主要方式