2017-04-01 15 views
9

我的应用程序允许根据用户角色访问内容。我为每个角色写了一个Router Guard。有些内容允许访问角色1或角色2或角色3。我应该如何在feature-routing.module.ts文件中写入canActivate声明?据我所知,如果我写Angular 2如何在同一路径上应用Or-Relationship上的多个警卫

canActivate:[Role1Guard, Role2Guard, Role3Guard] 

如果有任何警卫返回false,则访问将被拒绝。但就我而言,如果任何一名警卫回复真实,我应该允许进入。怎么做?提前谢谢了!

+1

最简单的解决方案是创建一个后卫,是以3个角色进去,这就是我的那一刻,Role1or2or3Guard做,但我喜欢一个更好的解决方案,我可以结合我现有的警卫...... – Seb

+0

是的,我也想过这个解决方案。对于一种情况,这将起作用,并且很容易实现。问题只发生在当你想概括它......如果你有5个角色,并且每一个组合都是可能的,你需要一个机器人来写所有的守卫类..... –

+1

是的,我知道,我有完全相同的问题...等待有人给你一个真正的解决方案;) – Seb

回答

1

我们在这种情况下可以做的事情是创建一个主卫队这将触发应用程序卫士根据我们的要求换货。

结帐this回答了解方法。

假设你已经通过它上面的链接,这种情况下的方法可以像修改Route类中的data属性一样简单。

事情是这样的 -

{ 
    path: "view2", 
    component: View2Component, 
    //attach master guard here 
    canActivate: [MasterGuard], 
    //this is the data object which will be used by 
    //masteer guard to execute guard1, guard 2, guard 3 & guard 4 
    data: { 
     trigger: { 
      operator: "OR", 
      guards: [ 
       GUARDS.GUARD1, 
       GUARDS.GUARD2, 
       GUARDS.GUARD3, 
       GUARDS.GUARD4 
      ] 
     } 
    } 
} 

然后用operator标志相应解雇所有警卫。

我希望这有助于:)

1

你可以写OrGuard,是这样的:

class OrGuard() { 
    guards: any[]; 
    constructor(...guards) { this.guards = guards } 

    canActivate() { 
    return this.guards.some(Boolean); 
    } 
} 

,并使用它像这样:

canActivate:[new OrGuard(Role1Guard, Role2Guard, Role3Guard)] 

...只是一个想法,实际执行可能会有所不同,我没有尝试(;

+5

如果守卫有任何依赖关系,这将不起作用。例如,如果他们需要发出HTTP请求。一个服务或一个类工厂将工作 –

+0

@Aluan Haddad,请你详细说明一下吗?如何用服务做到这一点,以及如何与班级工厂一起做到这一点?提前谢谢了! –

+0

对不起,我一直都很忙。 –

相关问题