La documentation angular2 sur Route Guards ne m'a pas permis de savoir quand il convenait d'utiliser un CanActivate
gardes par rapport à un CanActivateChild
gardien associé à des itinéraires sans composant.
TL; DR: à quoi sert-il d'avoir canActivateChild
quand je peux utiliser des routes sans composant avec canActivate
pour atteindre le même effet?
Version longue:
Nous pouvons avoir plusieurs gardes à tous les niveaux d'une hiérarchie de routage. Le routeur vérifie d'abord les gardes CanDeactivate et CanActivateChild, de la route enfant la plus profonde au sommet. Ensuite, il vérifie les gardes CanActivate du haut vers le plus petit des parcours enfants.
Je comprends que CanActivateChild
est coché de bas en haut et que CanActivate
est coché de haut en bas. Ce qui n'a pas de sens pour moi, c'est l'exemple suivant donné dans la documentation:
@NgModule({
imports: [
RouterModule.forChild([
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard],
children: [
{
path: '',
canActivateChild: [AuthGuard],
children: [
{ path: 'crises', component: ManageCrisesComponent },
{ path: 'heroes', component: ManageHeroesComponent },
{ path: '', component: AdminDashboardComponent }
]
}
]
}
])
],
exports: [
RouterModule
]
})
export class AdminRoutingModule {}
Donc, le chemin admin
a un itinéraire sans composant:
En examinant notre route enfant sous AdminComponent, nous avons une route avec un chemin et une propriété children, mais elle n’utilise pas de composant. Nous n'avons pas commis d'erreur dans notre configuration, car nous pouvons utiliser un itinéraire sans composant.
Pourquoi le code dans ce cas insère-t-il AuthGuard
dans le composant enfant et dans le composant racine (chemin admin
)? Ne serait-il pas suffisant de garder à la racine?
J'ai créé un plunkr basé sur l'exemple qui supprime le canActivateChild: [AuthGuard]
et ajoute un bouton de déconnexion sur le AdminDashboard
. Effectivement, le canActivate
de la route parente est toujours protégé, alors quel est l’intérêt d’avoir canActivateChild
lorsque je peux utiliser des routes sans composant avec canActivate
?
Lorsque nous avons appris la protection des itinéraires avec CanActivate, nous pouvons également protéger les itinéraires enfants avec CanActivateChild Guard. La garde CanActivateChild fonctionne de la même manière que la garde CanActivate, mais la différence est son exécution avant que chaque route enfant ne soit activée . Nous avons protégé notre module de fonctionnalités admin contre tout accès non autorisé, mais nous pourrions également protéger les itinéraires enfants au sein de notre module de fonctionnalités .
/admin
canActivate
est coché/admin
route, mais canActivate
n'est pas appelé car il protège /admin
canActivateChild
est appelé à chaque changement de fils de la route sur lequel il est défini.J'espère que cela vous aidera. Si cela n'est pas encore clair, vous pouvez vérifier certaines fonctionnalités en ajoutant des gardes qui les déboguent.
Dans le monde réel, j'estime qu'il est redondant d'utiliser la même protection pour le parent et tous ses enfants.
Pour un meilleur exemple, supposons que vous ayez des rôles pour les utilisateurs administrateurs (Édition/Affichage), vous pouvez ajouter une protection pour les onglets "Éditer" uniquement.
RouterModule.forChild([
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard], //1 - redirect to login page if not logged in
children: [
//View Access
{
......
},
//Edit Access
{
path: '',
canActivateChild: [EditGuard], //2 - display "you don't have Edit permission to access this page"
children: [
{ path: 'crises', component: ManageCrisesComponent },
{ path: 'heroes', component: ManageHeroesComponent },
{ path: '', component: AdminDashboardComponent }
]
}
]
}
])
J'ai également confondu la documentation d'angular2 sur routeGuard. Quelle est la différence entre le CanActivate
guard et le CanActivateChild
guard.
J'ai quelques résultats, j'espère que cela vous aidera.
dans le auth-guard.service.ts
fichier
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.checkLogin(url);
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.canActivate(route, state);
}
parce que la méthode canActivate
est appelée dans la fonction canActivateChild
. vous pouvez écrire un extrait de code qui n'appelle pas la méthode canActivate
dans la fonction canActivateChild
.
Une des raisons pour laquelle je peux penser est timeouts.
Je commence à travailler avec Angular 2, à l'aide d'un fournisseur d'authentification. Ce fournisseur expire une session inactive depuis plus d'un certain temps.
Dans une situation courante où vous laissez votre ordinateur connecté et la session expirée, la navigation suivante que vous essayez DOIT valider votre situation actuelle. Si vous naviguez entre des itinéraires enfants, je pense que CanActivateChild
est la protection qui détectera la session expirée et déclenchera une redirection vers la connexion, tandis que CanActivate
ne se déclenchera pas du tout.
Disclaimer: Cela vient de mon esprit, je ne l'ai pas encore implémenté.
TL; DR:CanActivate
et CanActivateChild
ne sont pas destinés à une route sans composant.
Je pense que les docs ont simplement négligé l'inutile des deux gardes dans un itinéraire sans composant, car l'intention était simplement de démontrer le parcours sans composant dans un point particulier des docs et l'utilisation des deux gardes dans un autre.
L'utilisation des deux gardes peut être très utile dans des scénarios spécifiques, par exemple: Un tableau de bord d'administration permettant à l'utilisateur de se connecter pour voir plusieurs composants, tels que le mailing, les statistiques de journalisation, l'utilisation des ressources, etc. - à ce niveau, l'accès est limité par le CanActivate
guard - en essayant de naviguer dans chaque composant, les rôles de chaque utilisateur admin sont vérifiés par le CanActivateChild
guard.
Et si vous avez 10 enfants définis.
Ensuite, canActivateChild
n'a besoin d'aller au même endroit que s'ils ont tous une exigence commune, par opposition à 10 canActivate
sur chaque enfant.