auth.service.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import jwt from 'jsonwebtoken';
  2. import { UserService } from '../users/user.service';
  3. import { UserEntity as User } from '../users/user.entity';
  4. import { DisabledStatus } from '@/share/types';
  5. import debug from 'debug';
  6. const logger = {
  7. info: debug('backend:auth:info'),
  8. error: debug('backend:auth:error')
  9. }
  10. const JWT_SECRET = 'your-secret-key'; // 生产环境应使用环境变量
  11. const JWT_EXPIRES_IN = '7d'; // 7天有效期
  12. const ADMIN_USERNAME = 'admin';
  13. const ADMIN_PASSWORD = 'admin123';
  14. export class AuthService {
  15. private userService: UserService;
  16. constructor(userService: UserService) {
  17. this.userService = userService;
  18. }
  19. async ensureAdminExists(): Promise<User> {
  20. try {
  21. let admin = await this.userService.getUserByUsername(ADMIN_USERNAME);
  22. if (!admin) {
  23. logger.info('Admin user not found, creating default admin account');
  24. admin = await this.userService.createUser({
  25. username: ADMIN_USERNAME,
  26. password: ADMIN_PASSWORD,
  27. nickname: '系统管理员',
  28. isDisabled: DisabledStatus.ENABLED
  29. });
  30. logger.info('Default admin account created successfully');
  31. }
  32. return admin;
  33. } catch (error) {
  34. logger.error('Failed to ensure admin account exists:', error);
  35. throw error;
  36. }
  37. }
  38. async login(username: string, password: string): Promise<{ token: string; user: User }> {
  39. try {
  40. // 确保admin用户存在
  41. if (username === ADMIN_USERNAME) {
  42. await this.ensureAdminExists();
  43. }
  44. const user = await this.userService.getUserByUsername(username);
  45. if (!user) {
  46. throw new Error('User not found');
  47. }
  48. const isPasswordValid = await this.userService.verifyPassword(user, password);
  49. if (!isPasswordValid) {
  50. throw new Error('Invalid password');
  51. }
  52. const token = this.generateToken(user);
  53. return { token, user };
  54. } catch (error) {
  55. logger.error('Login error:', error);
  56. throw error;
  57. }
  58. }
  59. generateToken(user: User): string {
  60. const payload = {
  61. id: user.id,
  62. username: user.username,
  63. roles: user.roles?.map(role => role.name) || []
  64. };
  65. return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });
  66. }
  67. verifyToken(token: string): any {
  68. try {
  69. return jwt.verify(token, JWT_SECRET);
  70. } catch (error) {
  71. console.error('Token verification failed:', error);
  72. throw new Error('Invalid token');
  73. }
  74. }
  75. async logout(token: string): Promise<void> {
  76. try {
  77. // 验证token有效性
  78. const decoded = this.verifyToken(token);
  79. if (!decoded) {
  80. throw new Error('Invalid token');
  81. }
  82. // 实际项目中这里可以添加token黑名单逻辑
  83. // 或者调用Redis等缓存服务使token失效
  84. return Promise.resolve();
  85. } catch (error) {
  86. console.error('Logout failed:', error);
  87. throw error;
  88. }
  89. }
  90. }