CanActivate не активирует маршрут - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь перенаправить пользователя на экран приложения или входа в систему, когда дешифрует зарегистрированного пользователя.

Я использую Angular "~ 8.1.0-next.2".В первый раз пытаюсь использовать Guards в приложении.

// IsLoggedGuard 
canActivate(
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

  console.log(state.url);

  return this.checkStore().pipe(
    switchMap(() => of(true)),
    catchError(() => of(false))
  )
}

checkStore(): Observable<boolean> {
  return this.store.select(selectAuthIsLogged).pipe(
    tap( isLogged => {
      if ( !isLogged ) 
        this.store.dispatch(AuthActions.Load_Current_User())
    }),
    filter(isLogged => isLogged),
    take(1)
  )
}
// LoginGuard
canActivate(
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

  return this.store.select(selectAuthIsLogged)
  .pipe(
    tap( logged => {
      if ( logged ) 
        this.router.navigate(['']);

      return of(!logged);
    })
  )
}
// AuthGuard
canActivate(
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

  return this.store.select(selectAuthIsLogged)
    .pipe(
      tap( logged => {
        if ( !logged ) 
          this.router.navigate(['login']);

        return of(logged);
      })
    )
}

У меня есть два маршрута ['login', ''], я вызываю двух охранников для каждого: 'login':IsLoggedGuard и LoginGuard '': IsLoggedGuard и AuthGuard

В AuthGuard, когда logged - true, вызывается приложение.Но я никогда не мог получить доступ к логину с определенным CanActivate.Если я удаляю CanActivate, можно войти в экран входа в систему.

1 Ответ

0 голосов
/ 02 июля 2019

Вы должны возвращать true или false в вашей защите, потому что маршрутизатор ожидал логическое возвращаемое значение, подобное этому

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

  async canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Promise<boolean> {
    const user = await this.authService.isAuthenticated();

    if (!user) {
      this.router.navigateByUrl("/account");
      return false;
    }

    return true;
  }
}

Таким образом, ваш код должен быть

canActivate(
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

  return this.store.select(selectAuthIsLogged)
    .pipe(
      tap( logged => {
        if ( !logged ) {
          this.router.navigate(['login']);
          return false
        } 

        return true;
      })
    )
}
...