auth.service.ts 2.6 KB

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