Angular2 Authguard маршрут для входа

Если пользователь, который не вошел в систему, хочет зайти в какой-нибудь безопасный рут, например, "/items" authguard вернет false и не будет перемещаться по "/login".

export const APP_ROUTES: Routes = [
  {path: '', component: PublicComponent, children: PUBLIC_ROUTES},
  {
    path: '',
    component: SecureComponent,
    resolve: {user: UserResolver},
    canActivate: [AuthGuard],
    children: SECURE_ROUTES
  },
  {path: '', redirectTo: '/login', pathMatch: 'full'}
];

Код AuthGuard:

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private userService: UserService) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    let url: string = state.url;
    return this.checkLogin(url);
  }

  checkLogin(url: string): Observable<boolean> {
    this.userService.redirectUrl = url;
    return this.userService.getPrincipal()
      .map(user => {
        if(user)
          return true;

        return false;
      });
  }
}

1 ответ

Решение

Впрыскивать Routerи перенаправить на страницу входа, если пользователь не вошел в систему следующим образом:

@Injectable()
export class AuthGuard implements CanActivate {

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

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean{
    let url: string = state.url;
    return this.checkLogin(url);
  }

  checkLogin(url: string): Observable<boolean> {
    this.userService.redirectUrl = url;
    return this.userService.getPrincipal()
      .map(user => {
        if(user)
          return true;

        this.router.navigate(['login']);
        return false;
      });
  }
}
Другие вопросы по тегам