Реализация AuthGuard на странице входа - PullRequest
0 голосов
/ 04 мая 2020

Я охранник маршрутизатора, поэтому, если пользователь вошел в систему, он не должен позволять пользователям go на /login. Но я могу go /login, даже если я вошел в систему.

Это authGuard

export class AuthGuard implements CanActivate {
    constructor(private apiService: ApiService,
                private router: Router) {
    }

    canActivate(
        route: ActivatedRouteSnapshot,
        router: RouterStateSnapshot):
        | boolean
        | UrlTree
        | Promise<boolean | UrlTree>
        | Observable<boolean | UrlTree> {
        return this.apiService.session.pipe(
            take(1),
            map(session => {
                const isAuth = !!session;
            if (isAuth) {
                    return true;
                }
                return this.router.createUrlTree(['/login']);

            })
        );
    }
}

Модуль маршрутизации


const routes: Routes = [
    {
        path: 'login',
        component: LoginComponent,
    },
    {
        path: 'dashboard',
        canActivate: [AuthGuard],
        component: DashboardComponent
    }
];

1 Ответ

1 голос
/ 04 мая 2020

Создайте охрану для login маршрута (в основном похожего на ваш AuthGuard, но с перевернутым логином c):

@Inject({providedIn: 'root'})
export class AuthLoginGuard implements CanActivate {
  constructor(private apiService: ApiService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot,
      router: RouterStateSnapshot): Observable<boolean | UrlTree> {
    return this.apiService.session.pipe(
      take(1),
      map(session => session ? this.router.createUrlTree(['/dashboard']) : true)
    );
  }
}

И добавьте его в свой маршрут входа в систему:

const routes: Routes = [
  {
    path: 'login',
    component: LoginComponent,
    canActivate: [AuthLoginGuard]
  },
  {
    path: 'dashboard',
    canActivate: [AuthGuard],
    component: DashboardComponent
  }
];
...