如何处理 Angular 2 CanActivate Route Guards
how to handle Angular 2 CanActivate Route Guards
我已经在我的应用程序上实现了 Route Guards。在用户访问仪表板路由之前,我检查了用户是否已登录。
登录后用户访问仪表板工作正常,但如果用户在未登录的情况下尝试访问路线仪表板,则会出现空白页面。执行 CanActivate Guard 并且它 return false。
但是,如果 CanActivate 失败,我想将用户重定向到日志页面。
如果 Route Guard 失败,如何将用户重定向到另一个 Route?
这是我关注的内容
import { Routes, RouterModule } from '@angular/router';
import { AccountPage } from './account-page';
import { LoginRouteGuard } from './login-route-guard';
import { SaveFormsGuard } from './save-forms-guard';
const routes: Routes = [
{ path: 'home', component: HomePage },
{
path: 'accounts',
component: AccountPage,
canActivate: [LoginRouteGuard],
canDeactivate: [SaveFormsGuard]
}
];
export const appRoutingProviders: any[] = [];
export const routing = RouterModule.forRoot(routes);
import { CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService) {}
canActivate() {
return this.loginService.isLoggedIn();
}
}
您可以在 AuthGuardService
中注入 Router
并在 this.loginService.isLoggedIn()
返回 false 时重定向到 logging
页面。
import { CanActivate, Router } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService, private router: Router) {}
canActivate() {
if(this.loginService.isLoggedIn()) {
return true;
} else {
this.router.navigate(['/login']); // redirect to login page for example
return false;
}
}
}
您可以通过将路由器注入守卫并调用 navigate()
来在守卫内部重定向
import { Router, CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(
private loginService: LoginService,
private router: Router
) {}
canActivate() {
if(this.loginService.isLoggedIn()) {
return true;
}
this.router.navigate(['/route/to/wherever/you/want']);
return false;
}
本文摘自official docs。
在您的 Guard 中,您可以使用路由器重定向到登录页面:
import { CanActivate, Router } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService, private router: Router) {}
canActivate() {
let result = this.loginService.isLoggedIn();
// Case not logged
if(!result) {
this.router.navigate(['/login']);
}
return result;
}
}
1。创建一个 class 实现路由器模块的 CanActivate
import {Injectable} from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { LoginService } from './login/login.service';
// Here LoginService is a custom service to check the user authentication.
@Injectable()
export class CanActivateAuthGuard implements CanActivate {
constructor(private router: Router, private loginService: LoginService) { };
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
if (this.loginService.GetAuthStatus()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
};
}
2。将 class 添加到提供程序数组到 app.module.ts 文件中的 NgModule
import { CanActivateAuthGuard } from './auth.guard';
@MgModule({
providers: [
...
CanActivateAuthGuard,
...
],
})
3。在路由器常量中使用canActivate中的服务(由angular路由器提供)属性
{ path: 'dashboard' , component: DashBoardComponent, canActivate: [CanActivateAuthGuard] }
我已经在我的应用程序上实现了 Route Guards。在用户访问仪表板路由之前,我检查了用户是否已登录。
登录后用户访问仪表板工作正常,但如果用户在未登录的情况下尝试访问路线仪表板,则会出现空白页面。执行 CanActivate Guard 并且它 return false。
但是,如果 CanActivate 失败,我想将用户重定向到日志页面。
如果 Route Guard 失败,如何将用户重定向到另一个 Route?
这是我关注的内容
import { Routes, RouterModule } from '@angular/router';
import { AccountPage } from './account-page';
import { LoginRouteGuard } from './login-route-guard';
import { SaveFormsGuard } from './save-forms-guard';
const routes: Routes = [
{ path: 'home', component: HomePage },
{
path: 'accounts',
component: AccountPage,
canActivate: [LoginRouteGuard],
canDeactivate: [SaveFormsGuard]
}
];
export const appRoutingProviders: any[] = [];
export const routing = RouterModule.forRoot(routes);
import { CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService) {}
canActivate() {
return this.loginService.isLoggedIn();
}
}
您可以在 AuthGuardService
中注入 Router
并在 this.loginService.isLoggedIn()
返回 false 时重定向到 logging
页面。
import { CanActivate, Router } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService, private router: Router) {}
canActivate() {
if(this.loginService.isLoggedIn()) {
return true;
} else {
this.router.navigate(['/login']); // redirect to login page for example
return false;
}
}
}
您可以通过将路由器注入守卫并调用 navigate()
import { Router, CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(
private loginService: LoginService,
private router: Router
) {}
canActivate() {
if(this.loginService.isLoggedIn()) {
return true;
}
this.router.navigate(['/route/to/wherever/you/want']);
return false;
}
本文摘自official docs。
在您的 Guard 中,您可以使用路由器重定向到登录页面:
import { CanActivate, Router } from '@angular/router';
import { Injectable } from '@angular/core';
import { LoginService } from './login-service';
@Injectable()
export class LoginRouteGuard implements CanActivate {
constructor(private loginService: LoginService, private router: Router) {}
canActivate() {
let result = this.loginService.isLoggedIn();
// Case not logged
if(!result) {
this.router.navigate(['/login']);
}
return result;
}
}
1。创建一个 class 实现路由器模块的 CanActivate
import {Injectable} from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { LoginService } from './login/login.service';
// Here LoginService is a custom service to check the user authentication.
@Injectable()
export class CanActivateAuthGuard implements CanActivate {
constructor(private router: Router, private loginService: LoginService) { };
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
if (this.loginService.GetAuthStatus()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
};
}
2。将 class 添加到提供程序数组到 app.module.ts 文件中的 NgModule
import { CanActivateAuthGuard } from './auth.guard';
@MgModule({
providers: [
...
CanActivateAuthGuard,
...
],
})
3。在路由器常量中使用canActivate中的服务(由angular路由器提供)属性
{ path: 'dashboard' , component: DashBoardComponent, canActivate: [CanActivateAuthGuard] }