Ionic4 Angular AuthGuard работает для домашней страницы, а не для входа на страницу - PullRequest
0 голосов
/ 11 ноября 2018

Я создал Authguard для своего веб-приложения и назначил несколько маршрутов, таких как Дом, Вход в систему, Регистрация и т. Д.

Ожидаемое поведение:

  1. Домашняя страница - намерение показать страницу входа, если пользователь не вошел в систему
  2. Вход, регистрация, забытый пароль и т. Д. - цель состоит в том, чтобы перенаправить пользователя на домашнюю страницу, если он уже вошел в систему (чтобы не отображать страницу входа вошедшему в систему пользователю, если пользователь вводит URL-адрес в адресная строка)

Фактическое поведение:

  1. Если пользователь, который не вошел в систему, заходит на домашнюю страницу, он перенаправляется на страницу входа, но страница не отображается.

  2. Если пользователь заходит на страницу входа по URL, страница снова не отображается. [Независимо от того, вошел ли пользователь в систему или нет]

  3. Если я удаляю защиту для страницы входа, загрузка домашней страницы перенаправляет пользователя на страницу входа, и страница отображается правильно.

Мой код AuthGuard

 @Injectable()
export class AuthGuard implements CanActivate {
  constructor(
    private afAuth: AngularFireAuth,
    private router: Router,
    private storageService: LocalStorageService
  ) {}
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | boolean {

    return this.afAuth.authState.pipe(
      take(1),
      map(user => !!user),
      tap(loggedIn => {
        const url = route.url.toString();
        if (url === ROUTE_SIGNIN || url === ROUTE_SIGNUP || url.includes(ROUTE_FORGOT_PASSWORD) ) {
          if (loggedIn) {
            this.router.navigate([ROUTE_HOME]);
            return of(false);
          }
        } else if (url === ROUTE_HOME) {
          const skipped = this.storageService.getValue(KEY_SIGNIN_SKIPPED);
          if (!loggedIn && !skipped) {
            this.router.navigate([ROUTE_SIGNIN]);
            return of(false);
          }
        }
        return of(true);
      })
    );
  }
}

EDIT: Маршруты:

  const routes: Routes = [
  {
    path: '',
    redirectTo: ROUTE_HOME,
    pathMatch: 'full'
  },
  { path: ROUTE_HOME, loadChildren: './pages/home/home.module#HomePageModule', canActivate: [AuthGuard] },
  { path: ROUTE_NAV_LIST, loadChildren: './pages/list/list.module#ListPageModule', canActivate: [AuthGuard]  },
  { path: ROUTE_SIGNIN, loadChildren: './pages/signin/signin.module#SigninPageModule', canActivate: [AuthGuard] },
  { path: ROUTE_SIGNUP, loadChildren: './pages/signup/signup.module#SignupPageModule', canActivate: [AuthGuard]  },
  { path: ROUTE_FORGOT_PASSWORD, loadChildren: './pages/forgot-password/forgot-password.module#ForgotPasswordPageModule'
    , canActivate: [AuthGuard]  },
  { path: ROUTE_PHONE_VERIFICATION, loadChildren: './pages/phone-verification/phone-verification.module#PhoneVerificationPageModule'
    , canActivate: [AuthGuard]  },

];

Я могу понять, что проблема заключается в назначении Authguard на страницу входа. Но я не мог определить, что является причиной проблемы. Кто-нибудь из вас может указать мне правильное направление?

...