web-dev-qa-db-ja.com

Angular 2同じパス上でOr-Relationshipを使用して複数のガードを適用する方法

私のアプリケーションでは、ユーザーロールに基づいてコンテンツにアクセスできます。役割ごとにルーターガードを作成しました。一部のコンテンツでは、role1、role2、またはrole3にアクセスできます。そのcanActivate宣言をfeature-routing.module.tsファイルにどのように書き込む必要がありますか?私が理解しているように、私が書くなら

canActivate:[Role1Guard, Role2Guard, Role3Guard]

ガードのいずれかがfalseを返すと、アクセスは拒否されます。しかし、私の場合、ガードのいずれかがtrueを返した場合は、アクセスを許可する必要があります。どうやるか?よろしくお願いします!

13
Nicole Naumann

この場合にできることは、マスターガードを作成することです。これにより、要件に従ってアプリケーションガードがトリガーされます。

チェックアウト this アプローチを理解するための回答。

上記のリンクを通過したと仮定すると、この場合のアプローチは、dataクラスのRouteプロパティを変更するのと同じくらい簡単です。

このようなもの -

{
    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フラグを使用して、それに応じてすべてのガードを起動します。

これがお役に立てば幸いです:)

2
planet_hunter

OrGuardは、次のように書くことができます。

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

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

次のように使用します。

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

...単なるアイデアです。実際の実装は異なる可能性があります。私は試しませんでした(;

1
Sasxa