我有一个有两名canActivate守卫的路线(AuthGuard和RoleGuard).first(AuthGuard)检查用户是否已登录,如果没有,则重定向到登录页面.第二个检查用户是否具有允许查看页面的角色定义,如果没有,则重定向到未授权页面.
canActivate: [ AuthGuard, RoleGuard ]
...
export class AuthGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
...
this.router.navigate(['/login']);
resolve(false);
}
export class RoleGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
...
this.router.navigate(['/unauthorized']);
resolve(false);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我访问路线并且我没有登录时,我点击了AuthGuard,它失败并告诉路由器导航到/login.然而,即使AuthGuard失败RoleGuard了,然后运行然后导航到/unauthorized.
在我看来,如果第一个失败,那么运行下一个后卫是毫无意义的.有没有办法强制执行此行为?
可以在阵列中定义Angular 2路由器防护装置.例如:
<code>
canActivate: ['CanAlwaysActivateGuard','AuthGuard']
</code>
Run Code Online (Sandbox Code Playgroud)
以下是我的问题:
我知道当canActivate函数返回一个简单的时boolean,角度路径保护以指定的顺序执行,但是,如果守卫返回类型Observable<boolean>或Promise<boolean>?
路线示例:
{
path: 'confirm',
canActivate: [AuthGuard, SessionExpiredAuthGuard, CheckoutAuthGuard],
component: CheckoutReviewOrderComponent
},
Run Code Online (Sandbox Code Playgroud)
SessionExpiredAuthGuard和CheckoutAuthGuard都返回类型Observable<boolean>.我不希望在SessionExpiredAuthGuard完成从异步http请求中检索数据之前执行CheckoutAuthGuard.
有没有办法强制这些异步防护按顺序执行?