auth.service.ts 2.5 KB

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