Angular2在另一名后卫解决后运行Guard

时间:2016-12-23 07:26:29

标签: javascript angular angular2-routing

在我的项目中,我有两名警卫。 AuthGuard和PermissionGuard。我需要首先运行AuthGuard,当它解决时,如果是true,则权限保护开始,但现在这些守卫正在并行运行,而且权限保护不能正常运行。我用于此问题的方式是我在Permission guard中调用了AuthGuard CanActivate方法,但我认为有一种更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:0)

我看到它做的最好方法是暴露子路由上的路由器防护。这是一个working example

{ path:'', canActivate:[AuthorizationService1], children: [ { path:'', canActivate:[AuthorizationService2],component: HomeComponent } ] }

答案 1 :(得分:0)

不幸的是,后卫不能真正依靠彼此。您可以按照另一个人的建议去做,在父路线上做一个,在子路线上做一个,或者我的选择只是让第三名后卫自己按顺序进行两项检查,所以我不必弄乱我的路线,假设它们被实现为可观察的:

@Injectable({ providedIn: 'root' })
export class AuthAndPermissionGuard implements CanActivate {
  constructor(private authGuard: AuthGuard, permGuard: PermGuard) { }
  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.authGuard.canActivate(next, state).pipe(
      switchMap(isAuthed => isAuthed ? this.permGuard.canActivate(next, state) : of(false))
    );
  }
}

答案 2 :(得分:0)

您可以轻松地将两个 gurd 传递到这样的路线:

{
   path:'', canActivate:[AuthorizationGuards1,AuthorizationGuards2] 
}

AuthorizationGuards1成功AuthorizationGuards2激活后,这两个守卫之间的关系很像AuthorizationGuards1 && AuthorizationGuards2条件。