CanActivate : nécessitant une authentification
Les applications limitent souvent l'accès à une zone de fonctionnalités en fonction de l'identité de l'utilisateur.
Vous pouvez autoriser l'accès uniquement aux utilisateurs authentifiés ou aux utilisateurs dotés d'un rôle spécifique.
Vous pouvez bloquer ou limiter l'accès jusqu'à l'activation du compte de l'utilisateur.
La CanActivategarde est l'outil pour gérer ces règles métier de navigation.
Ajouter un module de fonctionnalité admin
Dans cette section, vous allez étendre le centre de crise avec de nouvelles fonctionnalités administratives.
Ces fonctionnalités ne sont pas encore définies. Mais vous pouvez commencer par ajouter un nouveau module de fonctionnalité nommé AdminModule.
Générez un admindossier avec un fichier de module de fonctions et un fichier de configuration de routage.
Ensuite, générez les composants de support.
La structure du fichier de fonctionnalités d'administration ressemble à ceci:
Le module de fonctions admin contient les éléments AdminComponentutilisés pour le routage dans le module de fonctions,
une route de tableau de bord et deux composants non terminés pour gérer les crises et les héros.
src / app / admin / admin / admin.component.html
src / app / admin / admin-tableau de bord / admin-dashboard.component.html
src / app / admin / admin.module.ts
src / app / admin / gérer-crises / gérer-crises.component.html
src / app / admin / manage-heroes / manage-heroes.component.html
Bien que le tableau de bord de l'administrateur RouterLinkne contienne qu'une barre oblique relative sans segment d'URL supplémentaire,
il est considéré comme une correspondance avec tout itinéraire situé dans la zone de fonctions de l'administrateur.
Vous voulez que le Dashboardlien soit actif uniquement lorsque l'utilisateur visite cet itinéraire.
L'ajout d'une liaison supplémentaire à DashboardrouterLink, marque le lien comme actif lorsque l'utilisateur navigue vers l'URL et non
lors de la navigation vers l'un des itinéraires enfants.[routerLinkActiveOptions]="{ exact: true }".//admin
Itinéraire sans composant : regrouper des itinéraires sans composant
src / app / admin / admin-routing.module.ts (routage admin)
En regardant la route des enfants sous le AdminComponent, il y a un pathet une children propriété mais elle n'utilise pas un component.
Vous n'avez pas commis d'erreur dans la configuration.
Vous avez défini un itinéraire sans composant.
L'objectif est de regrouper les Crisis Centeritinéraires de gestion sous le adminchemin.
Vous n'avez pas besoin d'un composant pour le faire.
Un itinéraire sans composant facilite la protection des itinéraires enfants.
Ensuite, importez-le AdminModuledans app.module.tset ajoutez-le au importstableau pour enregistrer les routes d'administration.
src / app / app.module.ts (module d'administration)
Ajoutez un lien "Admin" au AppComponentshell afin que les utilisateurs puissent accéder à cette fonctionnalité.
src / app / app.component.html (modèle)
Garder la fonctionnalité admin
Actuellement, tous les itinéraires du centre de crise sont ouverts à tous.
La nouvelle fonctionnalité admin devrait être accessible uniquement aux utilisateurs authentifiés.
Vous pouvez masquer le lien jusqu'à ce que l'utilisateur se connecte.
Mais c'est difficile et difficile à maintenir.
Au lieu de cela, vous écrirez une canActivate()méthode de protection pour rediriger les utilisateurs anonymes vers la page de connexion
lorsqu'ils essaieront d'entrer dans la zone d'administration.
Il s'agit d'une protection à usage général (vous pouvez imaginer d'autres fonctionnalités nécessitant des utilisateurs authentifiés) afin
de générer un AuthGuarddans le authdossier.
Pour le moment, vous êtes intéressé par le fonctionnement des protecteurs.
La première version ne sert donc à rien. Il se connecte simplement à console et à returnstrue immédiatement, permettant à la navigation de continuer:
src / app / auth / auth.guard.ts (extrait)
Ensuite, ouvrez admin-routing.module.ts, importez la AuthGuardclasse et mettez à jour la route d'administration
avec une canActivatepropriété guard qui la référence:
src / app / admin / admin-routing.module.ts (route d'administration gardée)
La fonctionnalité admin est maintenant protégée par le gardien, bien que mal protégée.
Enseigner à AuthGuard l'authentification
Faites AuthGuardau moins prétendre vous authentifier.
Le AuthGuarddoit appeler un service d'application capable de connecter un utilisateur et de conserver des informations sur l'utilisateur actuel.
Générez un nouveau AuthServicedans le authdossier:
Mettez AuthService à jour le pour vous connecter à l'utilisateur:
src / app / auth / auth.service.ts (extrait)
Bien qu'il ne se connecte pas réellement, il a tout ce dont vous avez besoin pour cette discussion.
Il a un isLoggedIndrapeau pour vous dire si l'utilisateur est authentifié. Sa loginméthode simule un appel d'API à un service externe en
renvoyant ne observable résolue après une courte pause.
La redirectUrlpropriété stockera l'URL tentée afin que vous puissiez y accéder après l'authentification.
Révisez le AuthGuardpour l'appeler.
src / app / auth / auth.guard.ts (v2)
Notez que vous injectez le AuthServiceet le Routerdans le constructeur.
Vous n'avez pas encore fourni le AuthService, mais il est bon de savoir que vous pouvez injecter des services utiles dans les gardes d'acheminement.
Cette garde renvoie un résultat booléen synchrone. Si l'utilisateur est connecté, il renvoie true et la navigation se poursuit.
Le ActivatedRouteSnapshotcontient le futur itinéraire qui sera activé et le RouterStateSnapshot contient le futur RouterState de l'application,
si vous passez par le contrôle de garde.
Si l'utilisateur n'est pas connecté, vous stockez l'URL tentée dont il est issu RouterStateSnapshot.urlet indiquez au routeur qu'il doit accéder à une page
de connexion, page que vous n'avez pas encore créée. Cette navigation secondaire annule automatiquement la navigation en cours.
checkLogin()revient falsejuste pour être clair à ce sujet.
Ajouter le LoginComponent
Vous avez besoin d'un LoginComponentpour que l'utilisateur se connecte à l'application.
Une fois connecté, vous allez rediriger vers l'URL stockée, le cas échéant, ou utiliser l'URL par défaut.
Il n'y a rien de nouveau à propos de ce composant ou de la manière dont vous le connectez à la configuration du routeur.
Enregistrer un /loginitinéraire dans le auth/auth-routing.module.ts.
Dans app.module.ts, importez et ajoutez le AuthModuleaux AppModuleimportations.
src / app / app.module.ts
src / app / auth / login / login.component.html
src / app / auth / login / login.component.ts
src / app / auth / auth.module.ts