web-dev-qa-db-fra.com

Angular 2 Comment appliquer plusieurs gardes avec ou-relation sur le même chemin

Mon application permet d'accéder à des contenus basés sur des rôles d'utilisateur. J'ai écrit un garde de routeur pour chaque rôle. Certains contenus permettent l'accès pour role1 ou role2 ou role3. Comment devrais-je écrire cette déclaration canActivate dans le fichier feature-routing.module.ts? Si je comprends bien, si j'écris 

canActivate:[Role1Guard, Role2Guard, Role3Guard]

L'accès sera refusé si l'un des gardes renvoie faux. Mais dans mon cas, je devrais autoriser l'accès si l'un des gardes redevient vrai. Comment faire? Merci d'avance!

13
Nicole Naumann

Ce que nous pouvons faire dans ce cas est de créer un Maître Guard qui déclenchera les gardes de l’application selon nos besoins.

Checkout this answer pour comprendre l’approche.

En supposant que vous ayez parcouru le lien ci-dessus, l'approche dans ce cas pourrait être aussi simple que de modifier la propriété data dans la classe Route.

Quelque chose comme ça - 

{
    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
            ]
        }
    }
}

Ensuite, utilisez le drapeau operator pour licencier tous les gardes en conséquence.

J'espère que ça aide :)

1
planet_hunter

Vous pouvez écrire OrGuard, quelque chose comme:

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

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

et l'utiliser comme ça:

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

... juste une idée, la mise en oeuvre réelle peut être différente, je n’ai pas essayé (;

1
Sasxa