2017-02-13 20 views
0

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); 
    } 
    } 
+0

听起来像是正常的行为。如果**至少有一个警卫返回false,那么'canActivate'属性将阻止用户访问该路线。所以在你的情况下,如果'Admin1Guard'返回true并且'Admin2Guard'返回false,则不应该授予访问权限。您显示的代码是真实的代码吗?为什么你需要两个可观测物来测试同一个属性? – AngularChef

+0

嗯,如果其中至少有一个是真的(守卫之间的OR关系),我想要路由。 我在应用程序中有很多角色,每个角色都可以访问某些部分(当然也有部分可以被许多角色访问),这就是为什么我为每个角色创建了一个警卫。 有没有更好的方法来做到这一点? –

回答

2

我会重构检查角色的逻辑为单一,通用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; 
     }); 
    } 

} 
+0

你是对的,最好是这样做,但你的答案需要一些小的修正(我在编辑中做了修改,等待它的批准) –

+1

当然,谢谢。 :) – AngularChef

+0

我已经根据您的编辑添加了其他一些小改进(例如注入'AuthService')。这个代码中'.take(1)'的用法是什么? – AngularChef

相关问题