如果至少有一名警卫处于活动状态,请前往一条路线
Go to a route if at least one guard is active
Angular2 路由 运行 中的守卫按照它们提供的顺序排列。
但是对于有 observable 的守卫,即使第一个守卫为真,angular 也会忽略它,只应用第二个守卫的 observable 的结果。
我该如何解决这个问题?
const mainRoutes: Routes = [
{
path: 'app',
component:MainComponent,
canActivate:[AuthGuard],
children:[
{ path: 'dashboard', component: DashboardComponent },
{ path: 'protectedRoute', component: ProtectedRouteComponent, canActivate:[Admin1Guard,Admin2Guard] }
]}
];
第一后卫:
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);
}
}
我会将 role-checking 逻辑重构为 单一的通用 CheckRoleGuard
服务,并通过data
属性:
{
path: 'protectedRoute1',
component: SomeComponent,
canActivate: [CheckRoleGuard],
data: { allowedRoles: ['admin','editor'] }
},
{
path: 'protectedRoute2',
component: SomeComponent,
canActivate: [CheckRoleGuard],
data: { allowedRoles: ['admin'] }
}
现在 RoleGuard
服务:
@Injectable()
class CheckRoleGuard {
constructor(private authService: AuthService) { }
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
// Retrieve the allowed roles from `route.data`.
const allowedRoles = route.data['allowedRoles'];
return this.authService.getUser()
.map(data => {
return allowedRoles.indexOf(data.user.role) !== -1;
});
}
}
Angular2 路由 运行 中的守卫按照它们提供的顺序排列。 但是对于有 observable 的守卫,即使第一个守卫为真,angular 也会忽略它,只应用第二个守卫的 observable 的结果。
我该如何解决这个问题?
const mainRoutes: Routes = [
{
path: 'app',
component:MainComponent,
canActivate:[AuthGuard],
children:[
{ path: 'dashboard', component: DashboardComponent },
{ path: 'protectedRoute', component: ProtectedRouteComponent, canActivate:[Admin1Guard,Admin2Guard] }
]}
];
第一后卫:
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);
}
}
我会将 role-checking 逻辑重构为 单一的通用 CheckRoleGuard
服务,并通过data
属性:
{
path: 'protectedRoute1',
component: SomeComponent,
canActivate: [CheckRoleGuard],
data: { allowedRoles: ['admin','editor'] }
},
{
path: 'protectedRoute2',
component: SomeComponent,
canActivate: [CheckRoleGuard],
data: { allowedRoles: ['admin'] }
}
现在 RoleGuard
服务:
@Injectable()
class CheckRoleGuard {
constructor(private authService: AuthService) { }
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
// Retrieve the allowed roles from `route.data`.
const allowedRoles = route.data['allowedRoles'];
return this.authService.getUser()
.map(data => {
return allowedRoles.indexOf(data.user.role) !== -1;
});
}
}