auth.service.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // 检查用户是否被禁用
  47. if (user.isDisabled === DisabledStatus.DISABLED) {
  48. throw new Error('User account is disabled');
  49. }
  50. const isPasswordValid = await this.userService.verifyPassword(user, password);
  51. if (!isPasswordValid) {
  52. throw new Error('Invalid password');
  53. }
  54. const token = this.generateToken(user);
  55. return { token, user };
  56. } catch (error) {
  57. logger.error('Login error:', error);
  58. throw error;
  59. }
  60. }
  61. generateToken(user: User, expiresIn?: string): string {
  62. return JWTUtil.generateToken(user, expiresIn ? { expiresIn } as any : {});
  63. }
  64. verifyToken(token: string): any {
  65. return JWTUtil.verifyToken(token);
  66. }
  67. async logout(token: string): Promise<void> {
  68. try {
  69. // 验证token有效性
  70. const decoded = this.verifyToken(token);
  71. if (!decoded) {
  72. throw new Error('Invalid token');
  73. }
  74. // 实际项目中这里可以添加token黑名单逻辑
  75. // 或者调用Redis等缓存服务使token失效
  76. return Promise.resolve();
  77. } catch (error) {
  78. console.error('Logout failed:', error);
  79. throw error;
  80. }
  81. }
  82. }