2017-09-05 16 views
2

私はルートガードを使用して私の角度アプリケーションのフロントエンドを確保するために取り組んでいます。過去にそれらを使って作業し、オンラインで調べる際に、複数のガードをルートに追加するには、すべてがtrueを返してアクセスできるようにする必要があります。角度経路ガード:Or対And

しかし、の1つだけをに戻してアクセスを許可する場合はどうすればよいですか? 例えば

(代わりに& &の||のように)、私のルートガードは、ユーザーのトークンに一定の役割を探します。

@Injectable() 
export class ActiveRoleGuard implements CanActivate { 
    constructor(private sessionService: SessionService, private router: Router) { } 


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
     let token = this.sessionService.getToken(); 

     if (!token) { 
      return false; 
     } 

     if (token.role.toLowerCase().indexOf("active") < 0) { 
      this.router.navigate(["/issue"]); 
      return false; 
     } 

     return true; 
    } 
} 

そして

@Injectable() 
export class AdminRoleGuard implements CanActivate { 
    constructor(private sessionService: SessionService, private router: Router) { } 


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
     let token = this.appSessionService.getToken(); 

     if (!token) { 
      return false; 
     } 

     if (token.role.toLowerCase().indexOf("admin") < 0) { 
      this.router.navigate(["/issue"]); 
      return false; 
     } 

     return true; 
    } 
} 

私がいた場合それらをルータモジュールで普通に組み合わせると、...

{path: "someroute", component: SomeComponent, canActivate: [ActiveRouteGuard, AdminRouteGuard]}

...しかし、ユーザーにはActiveAdminの両方が必要です。しかし、Activeのいずれかを適用する場合は、Adminまたはaのいずれかを強制したい場合はどうすればよいですか?

それはそうのようなAPI に強制するために簡単です:

[Authorize(Roles = "Active")] 
[Authorize(Roles = "Admin, Manager")] 
public class SomeController : ApiController 

が、私は角度でこれをどのように行うのですか?

+0

清潔ではないにもかかわらず、両方のケースを管理する単一のガードを実行することはできますが、他の解決策はまだ見つかりません... これは、管理者にとっては、チェックしてください。あなたはあなたのトークンに 'admin'ロールを追加することでそれを修正することができます –

+0

重複する権限を持つ現在6つのロールがあるので、私はむしろ結合しません。しかし、これがAngularでサポートされていない場合はそれが私の最善の選択です –

答えて

2

2つの別々の実装があるのではなく、 "設定"できる単一のバージョンを使用することができます。これを行うには、dataプロパティのRouteを利用できます。たとえば、あなたのルートでは、あなたが何か行うことができます。これを使用して

{ 
    path: "someroute", 
    component: SomeComponent, 
    canActivate: [RoleRouteGuard], 
    data: { 
     requiredRoles: ["Role1", "Role2", "Role3"] 
    } 
} 

を、既存のCanActivate実装の1つを取り、それをより汎用的にすることができます。 requiredRolesのプロパティはdataからActivatedRouteSnapshotを経由してアクセスできます。例えば:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    const requiredRoles = route.data.requiredRoles; 
    .... 

あなたがこれを持ってたら、トークンの役割は、アレイ内にある場合は、必ず、必要なActive役割を持っているし、その後ワン場合は、など、など、

を確認することができますAdminまたはManagerロールの場合は、これを拡張して複数のdataプロパティを持つこともできます。たとえば、requiredRolesatLeastOneOfRolesがあり、これに応じて処理するロジックを更新することができます。この時点では多くのオプションがありますが、それについては助けが必要とは思われません。

+0

クリエイティブなソリューションは、これらのロールが変更されたり名前が変更された場合に、別の場所で非常に多くの文字列リテラルを渡す必要はありません。そうでなければ、それは面白い解決策です。 –

+0

この場合、ハードコードされた文字列の代わりに定数を使用できます。強調する問題は、Web API属性のアプローチとまったく同じです。いいえ? –

+2

@NathanFossこの場合、enumを使用できます。 – developer033

関連する問題