Aller au contenu principal

Routage et Guards

Exemple

image
<router-outlet></router-outlet>
  • Dans l'exemple, app.component.html contient un <router-outlet> pour charger HomeComponent
  • home.component.hmtl contient également un <router-outlet> pour charger le magasin et "mes cartes"

Le code

  • Il suffit d'ajouter à la route de HomeComponent la propriété children pour ajouter des routes enfants
const routes: Routes = [
{ path: "login", component: LoginComponent },
{ path: "register", component: RegisterComponent },
{
path: "",
component: HomeComponent,
children: [
{ path: "cards", component: PlayerCardsComponent },
{ path: "store", component: StoreComponent },
],
},
{ path: "**", redirectTo: "/" },
];

Sécurisé certaines routes

  • Les Guards permettent de sécuriser des routes
  • Dans notre contexte, imaginer devoir s'assurer que l'utilisateur est bien connecté avant d'accéder à une page
@Component({
selector: "app-home",
templateUrl: "./home.component.html",
styleUrls: ["./home.component.css"],
})
export class HomeComponent implements OnInit {
constructor(public router: Router) {}
ngOnInit() {
if (!this.logged()) {
this.router.navigate(["/login"]);
}
}
}
  • Il faudrait sûrement faire le ngOnInit dans chacune de nos pages
  • C'est l'automatisation que les Guards permettent de faire

Générer le Route Guard

  • Choisir le type CanActivate
ng generate guard

Les types de Guards

  • CanActivate
  • CanActivateChild
  • CanDeactivate

CanActivate

  • Regarde si un utilisateur peut visiter une route

CanActivateChild

  • Regarde si un utilisateur peut visiter une route enfant

CanDeactivate

  • Regarde si un utilisateur peut quitter une route (changements non sauvegardés)

Configuration

  • On doit placer le guard sur la ou les routes que l'on veut protéger
const routes: Routes = [
{ path: "login", component: LoginComponent },
{ path: "register", component: RegisterComponent },
{ path: "", component: HomeComponent, canActivate: [apiGuard, otherGuard] },
{ path: "**", redirectTo: "/" },
];
import { inject } from "@angular/core";
import { CanActivateFn, createUrlTreeFromSnapshot } from "@angular/router";
import { PlayerService } from "../services/player.service";
export const apiGuard: CanActivateFn = (route, state) => {
// On inject le service pour regarder si l'utilisateur est connecté
if (!inject(PlayerService).isLogged())
// S'il n'est pas connecté on le redirige vers la page de login
return createUrlTreeFromSnapshot(route, ["/login"]);
// S'il est connecté, tout est beau on continue!
else return true;
};
  • Si plusieurs guards sont spécifiés dans canActivate (comme apiGuard et otherGuard dans l'exemple précédent), ils sont évalués un à la suite de l'autre.
    • Donc apiGuard est appelé et s'il retourne true, otherGuard est appelé et s'il retourne également true, la route ciblée est atteinte