From f14bad4e3ea7ad97fdc3626590fdbd5aac8b6f26 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Thu, 5 Nov 2020 19:33:44 +0100 Subject: [PATCH] =?UTF-8?q?D=C3=A9but=20de=20la=20gestion=20des=20autorisa?= =?UTF-8?q?tions=20par=20role?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/app-routing.module.ts | 2 ++ .../collaborateurs.routing.module.ts | 11 +++++++- src/app/shared/auth/auth.guard.ts | 27 +++++++++++++++---- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 1543f6f..a792cff 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -10,6 +10,7 @@ import { AuthGuard } from '@shared/auth/auth.guard'; import { paths_collaborateurs, paths_demandes_delegation, paths_demandes_formation, paths_ep, paths_saisie_ep, paths_formation, paths_home, paths_referents } from '@shared/utils/paths'; +import { Role } from '@shared/utils/roles'; /** * L'ensemble des routes du client Angular @@ -26,6 +27,7 @@ const routes: Routes = [ path: paths_home.path, component: HomeComponent, canActivate: [AuthGuard], + data: { roles: [Role.assistante, Role.commercial, Role.rh, Role.collaborateur] }, pathMatch: 'full' }, //chargement des chemins du module collaborateur à partir du routing de ce module diff --git a/src/app/collaborateurs/collaborateurs.routing.module.ts b/src/app/collaborateurs/collaborateurs.routing.module.ts index f6cca60..8c2eda0 100644 --- a/src/app/collaborateurs/collaborateurs.routing.module.ts +++ b/src/app/collaborateurs/collaborateurs.routing.module.ts @@ -10,11 +10,20 @@ import { EditEvaluationComponent } from './formations-collaborateur/edit-evaluat import { paths_collaborateurs } from '@shared/utils/paths'; import { AuthGuard } from '@shared/auth/auth.guard'; +import { Role } from '@shared/utils/roles'; + + /** * Routes du module collaborateur */ const routes: Routes = [ - { path:'', component: CollaborateursComponent, pathMatch: 'full', canActivate: [AuthGuard] }, + { + path:'', + component: CollaborateursComponent, + canActivate: [AuthGuard], + data: { roles: [Role.assistante, Role.commercial, Role.rh] }, + pathMatch: 'full' + }, { path:paths_collaborateurs.formations, component: FormationsCollaboateurComponent, canActivate: [AuthGuard] }, { path:paths_collaborateurs.evaluation, component: EvaluationComponent, canActivate: [AuthGuard] }, { path:paths_collaborateurs.edit, component: EditEvaluationComponent, canActivate: [AuthGuard] }, diff --git a/src/app/shared/auth/auth.guard.ts b/src/app/shared/auth/auth.guard.ts index 03539d1..80171b3 100644 --- a/src/app/shared/auth/auth.guard.ts +++ b/src/app/shared/auth/auth.guard.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @@ -10,19 +10,36 @@ import { AuthService } from './auth.service'; */ @Injectable() export class AuthGuard implements CanActivate { - constructor(private authService: AuthService) { } + constructor(private authService: AuthService, private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.authService.canActivateProtectedRoutes$.pipe(tap(isLoggin => this.login(isLoggin))); + return this.authService.canActivateProtectedRoutes$.pipe(tap(isLoggin => this.login(isLoggin,route))); } /** - * Affiche la page de connexion si l'utilisateur n'est pas connecté. + * Vérifie si l'utilisateur est connecté et si l'utilisateur est autorisé à accéder à la route. * @param isLoggin Booléen permettant de savoir si l'utilisateur est connecté ou non + * @param route Route à laquelle l'utilisateur souhaite accéder */ - private login(isLoggin: boolean) { + private login(isLoggin: boolean, route: ActivatedRouteSnapshot): boolean { if (!isLoggin) { this.authService.login(); } + + const firstRole = this.authService.firstRole; + + if (firstRole) { + // Vérifie si la route est restreinte par des rôles + if (route.data.roles && route.data.roles.indexOf(firstRole) === -1) { + + // l'utisateur n'est pas autorisé alors on le redirige vers la page d'accueil + this.router.navigate(['/']); + + return false; + } + + // L'utilisateur est autorisé + return true; + } } }