Angular2路由中的警卫按其提供的顺序运行。 但是在有守卫者的情况下,即使第一个守卫是真实的,角度也会忽略它,并且只应用第二守卫的可观察结果。如果至少有一名警卫处于活动状态,则转到路线
我该如何解决这个问题?
const mainRoutes: Routes = [
{
path: 'app',
component:MainComponent,
canActivate:[AuthGuard],
children:[
{ path: 'dashboard', component: DashboardComponent },
{ path: 'protectedRoute', component: ProtectedRouteComponent, canActivate:[Admin1Guard,Admin2Guard] }
]}
];
第1保护:
canActivate() :Observable<boolean>{
return this.authService.getUser().map(res=>{
if(res.user.role=="admin1")
return true;
}).take(1);
}
}
第二后卫:
canActivate() :Observable<boolean>{
return this.authService.getUser().map(res=>{
if(res.user.role=="admin2")
return true;
}).take(1);
}
}
听起来像是正常的行为。如果**至少有一个警卫返回false,那么'canActivate'属性将阻止用户访问该路线。所以在你的情况下,如果'Admin1Guard'返回true并且'Admin2Guard'返回false,则不应该授予访问权限。您显示的代码是真实的代码吗?为什么你需要两个可观测物来测试同一个属性? – AngularChef
嗯,如果其中至少有一个是真的(守卫之间的OR关系),我想要路由。 我在应用程序中有很多角色,每个角色都可以访问某些部分(当然也有部分可以被许多角色访问),这就是为什么我为每个角色创建了一个警卫。 有没有更好的方法来做到这一点? –