当前位置: 首页 > 知识库问答 >
问题:

如何避免在Angular中刷新后注销

谷梁翰飞
2023-03-14

刷新页面后,我无法注销。我认为问题在于获取当前用户的方法或检查用户管理的方法。

管理员授权守卫。服务ts

export class AdminAuthGuardService implements CanActivate {

constructor(
    private router: Router,
    private userService: UserService,
) { }

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.checkLogin();
}

checkLogin(): Observable<boolean> {
    return this.userService.getCurrentUser().pipe(
        map(user => {
            if (user) {
                const isUserAdmin = this.userService.isRoleAdmin();
                if (isUserAdmin) {
                    return true;
                } else {
                    this.router.navigate(['/forbidden']);
                    return false;
                    
                }
            } else {
                this.router.navigate(['/login']);
                return false;
            }
        })
    );
}

}

使用者服务ts


    export class UserService {
    
      currentUser!: User | null;
    
      private usersUrl = `${SERVER_API_URL}/api/user`;
      private apiServerUrl = environment.apiBaseUrl;
    
      constructor(private http: HttpClient) { }
    
      getCurrentUser(): Observable {
        return this.http.get(`${this.usersUrl}/current-user`);
      }
    
      isRoleAdmin(): boolean {
        if (this.currentUser) {
          return this.currentUser.authorities.some((authority: string) => authority === Authority.ADMIN);
        } else {
          return false;
        }
      }
    
      isRoleUser(): boolean {
        if (this.currentUser) {
          return this.currentUser.authorities.some((authority: string) => authority === Authority.USER);
        } else {
          return false;
        }
      }
    
      isRoleDeleter(): boolean {
        if (this.currentUser) {
          return this.currentUser.authorities.some((authority: string) => authority === Authority.DELETER);
        } else {
          return false;
        }
      }
    
      getStudentsData(userId: number): Observable{
        return this.http.get(`${this.apiServerUrl}/api/user/edit/${userId}`);
      }
    
      updateUser(profesor: Profesors[], userId: number): Observable{
        return this.http.put(`${this.apiServerUrl}/api/user/update/${userId}`, profesor);
      }
    
    }

登录名。组成部分ts


    export class LoginComponent implements OnInit {
    
      authenticating = false; // to show loading
      loginFailed = false; // to show login failed message
    
      userCredentials!: UserCredentials;
      private loggedIn = new BehaviorSubject(localStorage.getItem("isLoggedIn") === "true");
    
    
      constructor(
        private loginService: LoginService,
        private router: Router,
        private userService: UserService
      ) {
      }
    
      ngOnInit(): void {
        this.userCredentials = new UserCredentials();
    
      }
    
    
      login() {
        this.authenticating = true;
        this.loginFailed = false;
    
        this.loginService.authenticate(this.userCredentials).subscribe(
          (jwtToken: JwtToken) => this.successfulLogin(jwtToken),
          () => this.loginFailed = true
        ).add(() => this.authenticating = false);
      }
    
      successfulLogin(jwtToken: JwtToken) {
        localStorage.setItem('token', jwtToken.token); // store token value to localstorage
        this.userService.getCurrentUser().subscribe((currentUser: User) => this.userService.currentUser = currentUser);
        this.router.navigate(['/home']);
      }
      isUserLoggedIn(): boolean {
        return !this.userService.currentUser;
      }
    }   

 

使用者模型ts


    export class User {
        id: number;
        username: string;
        firstName: string;
        lastName: string;
        authorities: string[];
    
        constructor(id: number, username: string, firstName: string, lastName: string, authorities: string[]){
            this.id = id;
            this.username = username;
            this.firstName = firstName;
            this.lastName = lastName;
            this.authorities = authorities;
        }
    }

共有2个答案

柴星津
2023-03-14

我通常会做的一件事是将ID保存在localStorage上。

当用户登录时,它会将id保存在localStorage上,当您尝试从该用户获取任何内容时,只需将id获取到localStorage。如果您想注销,只需从那里删除id,它就可以正常工作了!

我从来没有遇到过这样的问题,它总是对我有用!

注意:我只在测试某事时使用这种方式,而不是当它被认为是实时的时候

云韬
2023-03-14

我将从一些重构开始:

移动用户类中的角色检查方法:

export class User {
  id: number;
  username: string;
  firstName: string;
  lastName: string;
  authorities: string[];

  constructor(user?: Partial<User>) {
    Object.assign(this, user);
  }

  isRoleAdmin = () => {
      return this.authorities.some(authority => authority === Authority.ADMIN);
  }

  isRoleUser = () {
    return this.authorities.some(authority => authority === Authority.USER);
  }

  isRoleDeleter = () {
    return this.authorities.some(authority => authority === Authority.DELETER);
  }
}

然后,您可以从服务中删除角色方法,并确保调用用户类构造函数,否则它将不是用户类的实例,它将只是一个普通对象:

export class UserService {
  currentUser!: User | null;

  private usersUrl = `${SERVER_API_URL}/api/user`;
  private apiServerUrl = environment.apiBaseUrl;

  constructor(private http: HttpClient) {}

  getCurrentUser(): Observable<User> {
    return this.http.get<User>(`${this.usersUrl}/current-user`).pipe(
        map(user => new User(user))
    );
  }

  getStudentsData(userId: number): Observable {
    return this.http.get(`${this.apiServerUrl}/api/user/edit/${userId}`);
  }

  updateUser(profesor: Profesors[], userId: number): Observable {
    return this.http.put(
      `${this.apiServerUrl}/api/user/update/${userId}`,
      profesor
    );
  }
}

然后,可以这样实现防护:

export class AdminAuthGuardService implements CanActivate {
  constructor(private router: Router, private userService: UserService) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> {
    return this.checkLogin();
  }

  checkLogin(): Observable<boolean> {
    return this.userService.getCurrentUser().pipe(
      map((user) => {
        if (!user) {
          this.router.navigate(["/login"]);
          return false;
        }
        const isAllowed = user.isRoleAdmin();
        if (!isAllowed) {
          this.router.navigate(["/forbidden"]);
        }
        return isAllowed;
      })
    );
  }
}
 类似资料:
  • 考虑这个例子,其中主应用程序是两个模块的消费者:一个提供电子邮件服务,另一个提供日志服务。 app/email/email.service.ts app/email/email.module.ts providers: [ EmailService ], }) export class EmailModule { } 电子邮件服务api需要一些由字符串api-config标识的配置设置,由DI

  • 本文向大家介绍Java Web 如何避免 SQL 注入?相关面试题,主要包含被问及Java Web 如何避免 SQL 注入?时的应答技巧和注意事项,需要的朋友参考一下 使用预处理 PreparedStatement。 使用正则表达式过滤掉字符中的特殊字符。

  • 问题内容: 在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入。下面是示例代码,我尝试使用它来避免它,但是它不起作用。谁能告诉我如何纠正它? 输出:打印消息: 所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。 问题答案: 您可以将表名包含在 但是,如果使用两部分命名约定,例如,则必须添加其他解析,因为这将导致: 无效的对象名称[dbo.tablena

  • 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的

  • 我使用springcloud config server在生产环境中按计划在运行时刷新我的应用程序属性。我的日程表每两周一次,没有任何问题。 我的应用程序在Kubernetes cloud上运行在多个吊舱上。吊舱随时可能崩溃或重新启动。当pod崩溃/重新启动时,它在应用程序启动时从配置服务器和存储库中获取最新的属性文件,而不是等待下一个计划的刷新周期。 任何解决以上问题的建议将不胜感激。

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)