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;
});
}
}