Retour au cours

Protéger les routes filles (CanActivateChild)

Le Développeur Angular Complet : de Zéro à Héros

39. Protéger les routes filles (CanActivateChild)

Lors de l'utilisation du routage imbriqué, nous voulons souvent protéger toutes les routes filles sous une route parente (ex : toutes les routes sous /admin). CanActivateChild nous permet d'appliquer un guard unique à toute une section de l'application.

Routes imbriquées

Nous définissons des routes filles dans le tableau children d'une définition de route parente. Le composant parent (AdminComponent) doit contenir un <router-outlet> pour que les enfants s'affichent.

typescript const routes: Routes = [ { path: 'admin', component: AdminComponent, // Ce composant sert de conteneur canActivate: [AdminGuard], // Protège l'accès à l'AdminComponent lui-même canActivateChild: [AdminGuard], // Protège l'accès à tous les enfants children: [ { path: 'users', component: UserManagementComponent }, { path: 'settings', component: SettingsComponent } ] } ];

Implémentation de CanActivateChild

Le guard implémente CanActivateChild (en plus ou à la place de CanActivate). La logique est généralement la même : vérifier l'autorisation.

typescript // admin.guard.ts import { CanActivate, CanActivateChild, ... }

@Injectable({ providedIn: 'root' }) export class AdminGuard implements CanActivate, CanActivateChild {

// Vérifie l'accès pour la route parente canActivate(...) { /* logique de vérification */ return true; }

// Vérifie l'accès pour n'importe quelle route fille (ex : /admin/users) canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { // On peut utiliser le snapshot de la route pour vérifier des permissions spécifiques console.log(Vérification de la route fille : ${childRoute.url}); return this.authService.isAdmin(); } }

Ceci garantit que si l'utilisateur n'a pas les privilèges administratifs nécessaires, il ne peut accéder ni à /admin, ni à /admin/users, ni à /admin/settings.