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!
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 :)
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é (;