Aller au contenu

Protéger vos routes au même path

Parfois vous aurez envie qu’un même path renvoie sur deux routes (composants) différents selon une condition, cela peut-être le rôle de l’utilisateur ou un feature flag.

Le problème c’est que canActivate ne permet pas de faire ça, mais canMatch oui !

Si le guard passé dans le canMatch renvoie false, alors le router va skip la route actuelle et essayer les routes suivantes.


export function hasRoleGuard(role: Role): CanActivateFn {       
  return (route, state) => {
    const role$ = inject(UserStore).role$:
    
    // actuellement ce role 👇 est 'student'
    return role$.pipe(map(userRole => userRole === role));  
  };
} 
export const appRoutes: Route [] = [
  {
    path: 'room',
    loadComponent: () => import('./teachers-room.component'),
    // grâce à canMatch, le router va sauter ce path et essayer 
    // le path 'room' suivant car 👇 renvoie false
    canMatch: [hasRoleGuard('teacher')]
  }, 
  {
    path: 'room',
    loadComponent: () => import('./students-room.component'),
    // et ici, 👇 renvoie true donc 👆 va être chargé
    canMatch: [hasRoleGuard('student')]
  },
]