typescript 使用多个Angular 防护装置导致页面崩溃

o8x7eapl  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(122)

我正在尝试使用单独的网页单独的警卫。我基本上检查一个布尔参数,以了解是否有一个用户登录或没有。
这是我的两个密码

export class IsAuthenticatedGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router){}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return this.authService.isLoggedIn$.pipe(
      tap(isLoggedIn => {
        if(!isLoggedIn){
          //redirect
          this.router.navigate(['login']);
        }
      })
    );
  }
}
export class LoginPageGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router){}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return this.authService.isLoggedIn$.pipe(
      tap(isLoggedIn => {
        if(isLoggedIn){
          //redirect
          this.router.navigate(['overview-page']);
        }
      })
    );
  }
}

这是我使用guards的代码(app. module. ts)我删除了overview-page和login之间的页面,因为它们不相关。

HttpClientModule,
    RouterModule.forRoot([
      //{path: '', component: UserTargetsComponent },
      //{path: '', component: NavbarComponent },
      {path: '', component: OverviewPageComponent, canActivate: [IsAuthenticatedGuard]},
      {path: 'overview-page', component: OverviewPageComponent, canActivate:[IsAuthenticatedGuard]},
      {path: 'login', component: LoginComponent, canActivate: [LoginPageGuard]},
      {path: '**', component: NotFoundComponent, canActivate: [IsAuthenticatedGuard]}
    ])

在很短的一段时间内,它的工作正如我所期望的。如果用户登录它不允许去登录页面,引导您到概述页面,如果用户没有登录,反之亦然。
现在它只是没有React。只是去主页(localhost:xxx/)当我去登录页面输入浏览器栏。同样的概述页。经过几次尝试,页面通常崩溃,所以我重新启动角应用程序。
如果我停止使用登录页面上的canActivate,一切正常。当我把它再次打破。我猜这是不知何故造成这个问题,但如何?
有什么想法吗?也许我漏掉了什么小东西。

8dtrkrch

8dtrkrch1#

这可能是因为如果用户未登录,则LoginPageGuard返回false。因此,它会阻止加载“登录”路径,那么它们应该去哪里?如果它们未经身份验证,则LoginPageGuard应返回true;如果它们使用了重新路由,则LoginPageGuard应返回false

canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return this.authService.isLoggedIn$.pipe(
      map(isLoggedIn => {
        if(isLoggedIn){
          //redirect
          this.router.navigate(['overview-page']);
          // if they are authenticated do not allow them to load login
          return false;
        }
       // if they are NOT authenticated, allow them to load this route
       return true;
      })
    );

相关问题