auth.service.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { Injectable } from '@angular/core';
  2. import { BehaviorSubject, Observable } from 'rxjs';
  3. // 用户信息接口
  4. export interface UserInfo {
  5. id: string;
  6. name: string;
  7. avatar: string;
  8. roles: string[];
  9. permissions?: string[];
  10. lastLogin?: string;
  11. }
  12. @Injectable({
  13. providedIn: 'root'
  14. })
  15. export class AuthService {
  16. // 用户登录状态的BehaviorSubject
  17. private currentUserSubject: BehaviorSubject<UserInfo | null>;
  18. public currentUser: Observable<UserInfo | null>;
  19. constructor() {
  20. // 为了解决权限问题,我们简化实现,直接创建一个具有所有角色的用户
  21. const mockUser: UserInfo = {
  22. id: '1',
  23. name: '超级管理员',
  24. avatar: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjQ0NGRkNDIi8+PHRleHQgeD0iNTAlIiB5PSI1MCUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxMy4zMzMzMzMzMzMzMzMzMzQiIGZvbnQtd2VpZ2h0PSJib2lkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNTU1NTU1IiBkeT0iMC4zZW0iPkFETUlOPC90ZXh0Pjwvc3ZnPg==',
  25. roles: ['admin', 'user', 'teamLead'],
  26. permissions: ['view-all', 'edit-all', 'delete-all'],
  27. lastLogin: new Date().toISOString()
  28. };
  29. // 直接使用这个用户,不读取本地存储
  30. this.currentUserSubject = new BehaviorSubject<UserInfo | null>(mockUser);
  31. this.currentUser = this.currentUserSubject.asObservable();
  32. }
  33. // 获取当前用户信息
  34. public get currentUserValue(): UserInfo | null {
  35. return this.currentUserSubject.value;
  36. }
  37. // 检查用户是否已登录
  38. isLoggedIn(): boolean {
  39. return this.currentUserValue !== null;
  40. }
  41. // 获取用户角色
  42. getUserRoles(): string[] {
  43. return this.currentUserValue?.roles || [];
  44. }
  45. // 检查用户是否具有指定角色
  46. hasRole(role: string): boolean {
  47. return this.getUserRoles().includes(role);
  48. }
  49. // 检查用户是否具有管理员角色
  50. isAdmin(): boolean {
  51. return this.hasRole('admin');
  52. }
  53. // 登录方法
  54. login(username: string, password: string): Observable<boolean> {
  55. // 在实际应用中,这里会调用后端API进行身份验证
  56. // 这里使用模拟数据
  57. return new Observable<boolean>(observer => {
  58. // 模拟API延迟
  59. setTimeout(() => {
  60. // 模拟成功登录
  61. // 实际应用中,这里会根据后端返回的用户信息设置currentUser
  62. const mockUser: UserInfo = {
  63. id: '1',
  64. name: '超级管理员',
  65. avatar: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjQ0NGRkNDIi8+PHRleHQgeD0iNTAlIiB5PSI1MCUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxMy4zMzMzMzMzMzMzMzMzMzQiIGZvbnQtd2VpZ2h0PSJib2lkIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNTU1NTU1IiBkeT0iMC4zZW0iPkFETUlOPC90ZXh0Pjwvc3ZnPg==',
  66. roles: ['admin', 'user', 'teamLead'],
  67. permissions: ['view-all', 'edit-all', 'delete-all'],
  68. lastLogin: new Date().toISOString()
  69. };
  70. // 更新用户状态
  71. this.currentUserSubject.next(mockUser);
  72. observer.next(true);
  73. observer.complete();
  74. }, 1000);
  75. });
  76. }
  77. // 登出方法
  78. logout(): void {
  79. // 更新用户状态为null
  80. this.currentUserSubject.next(null);
  81. }
  82. // 更新用户信息
  83. updateUserInfo(userInfo: Partial<UserInfo>): void {
  84. const currentUser = this.currentUserValue;
  85. if (currentUser) {
  86. const updatedUser = { ...currentUser, ...userInfo };
  87. this.currentUserSubject.next(updatedUser);
  88. }
  89. }
  90. // 检查用户是否有权限执行某个操作
  91. hasPermission(permission: string): boolean {
  92. return this.currentUserValue?.permissions?.includes(permission) || false;
  93. }
  94. }