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