28
Angular : guard Achref El Mouelhi Docteur de l’universit ´ e d’Aix-Marseille Chercheur en programmation par contrainte (IA) Ing ´ enieur en g ´ enie logiciel [email protected] H & H: Research and Training 1 / 19

Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

  • Upload
    others

  • View
    14

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

Angular : guard

Achref El Mouelhi

Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)

Ingenieur en genie logiciel

[email protected]

H & H: Research and Training 1 / 19

Page 2: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

Plan

1 Introduction

2 Creation

3 Exemple avec CanActivate

4 Exemple avec CanDeactivate

H & H: Research and Training 2 / 19

Page 3: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Introduction

Angular

Guard?

Un service Angular (donc decore par @Injectable) quiimplemente une des interfaces suivantes

CanActivate : verifie si un utilisateur peut visiter une route.

CanDeactivate : verifie si un utilisateur peut quitter une route.

CanActivateChild : verifie si un utilisateur peut visiter les routesenfants.

CanLoad : verifie si un utilisateur peut aller sur une route d’unmodule defini avec un lazy loading

H & H: Research and Training 3 / 19

Page 4: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Introduction

Angular

Exemple

On veut que l’acces a la route /adresse soit seulement autoriseaux utilisateurs authentifies

On va creer une guard auth et l’associer a la route adresse

H & H: Research and Training 4 / 19

Page 5: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

Pour creer une guard

ng generate guard guard-name

Ou le raccourci

ng g g guard-name

H & H: Research and Training 5 / 19

Page 6: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

Pour creer une guard

ng generate guard guard-name

Ou le raccourci

ng g g guard-name

H & H: Research and Training 5 / 19

Page 7: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

Pour notre exemple, on va creer une garde qui verifie si unutilisateur est authentifie avant de charger certaines routes

ng g g guards/auth

Dans le menu qui s’affiche

Pointer sur CanActivate

Puis cliquer une premiere fois sur espace et une deuxieme surentree

H & H: Research and Training 6 / 19

Page 8: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

Pour notre exemple, on va creer une garde qui verifie si unutilisateur est authentifie avant de charger certaines routes

ng g g guards/auth

Dans le menu qui s’affiche

Pointer sur CanActivate

Puis cliquer une premiere fois sur espace et une deuxieme surentree

H & H: Research and Training 6 / 19

Page 9: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

On peut aussi preciser dans la commande l’interface aimplementer

ng g g guards/auth --implements CanActivate

ResultatCREATE src/app/guards/auth.guard.spec.ts (346 bytes)CREATE src/app/guards/auth.guard.ts (456 bytes)

H & H: Research and Training 7 / 19

Page 10: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Creation

Angular

On peut aussi preciser dans la commande l’interface aimplementer

ng g g guards/auth --implements CanActivate

ResultatCREATE src/app/guards/auth.guard.spec.ts (346 bytes)CREATE src/app/guards/auth.guard.ts (456 bytes)

H & H: Research and Training 7 / 19

Page 11: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Contenu du auth.guard.ts

import { Injectable } from ’@angular/core’;import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot,

UrlTree } from ’@angular/router’;import { Observable } from ’rxjs’;

@Injectable({providedIn: ’root’

})export class AuthGuard implements CanActivate {canActivate(

next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree> |

Promise<boolean | UrlTree> | boolean | UrlTree {return true;

}}

ActivatedRouteSnapshot : contient des informations comme les parametres envoyespour la route demandee...

RouterStateSnapshot :contient des informations comme l’URL de la route demandee

La methode canActivate ne fait aucun controle car elle retourne toujours true

H & H: Research and Training 8 / 19

Page 12: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Contenu du auth.guard.ts

import { Injectable } from ’@angular/core’;import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot,

UrlTree } from ’@angular/router’;import { Observable } from ’rxjs’;

@Injectable({providedIn: ’root’

})export class AuthGuard implements CanActivate {canActivate(

next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree> |

Promise<boolean | UrlTree> | boolean | UrlTree {return true;

}}

ActivatedRouteSnapshot : contient des informations comme les parametres envoyespour la route demandee...

RouterStateSnapshot :contient des informations comme l’URL de la route demandee

La methode canActivate ne fait aucun controle car elle retourne toujours true

H & H: Research and Training 8 / 19

Page 13: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Angular

Associons AuthGuard a la route /adresse dansapp-routing.module.ts

const routes: Routes = [// les autres routes{path: ’adresse’,component: AdresseComponent,canActivate: [AuthGuard]

},{ path: ’auth’, component: AuthComponent },// le reste des routes

];

La route /auth va permettre d’executer le composantAuthComponent et afficher et gerer l’authentification

H & H: Research and Training 9 / 19

Page 14: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Angular

Associons AuthGuard a la route /adresse dansapp-routing.module.ts

const routes: Routes = [// les autres routes{path: ’adresse’,component: AdresseComponent,canActivate: [AuthGuard]

},{ path: ’auth’, component: AuthComponent },// le reste des routes

];

La route /auth va permettre d’executer le composantAuthComponent et afficher et gerer l’authentification

H & H: Research and Training 9 / 19

Page 15: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Angular

Contenu de auth.component.html

<h1>Page d’authentification</h1><form (ngSubmit)="isAuthenticated()"><div>

Nom d’utilisateur :<input type=text [(ngModel)]=login name=login>

</div><div>

Mot de passe :<input type=text [(ngModel)]=password name=password><button type=submit>Se connecter</button>

</div><div [hidden]=’erreur’>Identifiants incorrects</div>

</form>

H & H: Research and Training 10 / 19

Page 16: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Contenu de auth.component.ts

import { Component, OnInit } from ’@angular/core’;import { Router } from ’@angular/router’;

@Component({selector: ’app-auth’,templateUrl: ’./auth.component.html’,styleUrls: [’./auth.component.css’]

})export class AuthComponent implements OnInit {erreur = true;password = ’’;login = ’’;constructor(private router: Router) { }ngOnInit() { }

isAuthenticated() {if (this.login === ’wick’ && this.password === ’john’) {

localStorage.setItem(’isConnected’, ’true’);this.router.navigateByUrl(’/personne’);

} else {this.erreur = false;

}}

}

H & H: Research and Training 11 / 19

Page 17: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Mettons a jour le contenu de auth.guard.ts

import { Injectable } from ’@angular/core’;import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot,

Router } from ’@angular/router’;

@Injectable({providedIn: ’root’

})export class AuthGuard implements CanActivate {

constructor(private router: Router) { }

canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot): boolean {if (Boolean(localStorage.getItem(’isConnected’))) {

return true;} else {

this.router.navigateByUrl(’/auth’);return false;

}}

}

H & H: Research and Training 12 / 19

Page 18: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanActivate

Angular

Pour tester

Essayez d’acceder a la route /adresse sans authentification

Authentifiez-vous avec les identifiants wick et john et reessayez

H & H: Research and Training 13 / 19

Page 19: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Angular

Remarque

Preciser l’interface a implementer pendant la generation existe depuis Angular 8

Angular-cli ne propose pas l’interface CanDeactivate

On va specifier l’interface CanActivate puis on modifie

Executons la commande suivante

ng g g guards/leave

Le resultat

CREATE src/app/guards/leave.guard.spec.ts (352 bytes) CREATEsrc/app/guards/leave.guard.ts (472 bytes)

H & H: Research and Training 14 / 19

Page 20: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Angular

Remarque

Preciser l’interface a implementer pendant la generation existe depuis Angular 8

Angular-cli ne propose pas l’interface CanDeactivate

On va specifier l’interface CanActivate puis on modifie

Executons la commande suivante

ng g g guards/leave

Le resultat

CREATE src/app/guards/leave.guard.spec.ts (352 bytes) CREATEsrc/app/guards/leave.guard.ts (472 bytes)

H & H: Research and Training 14 / 19

Page 21: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Angular

Remarque

Preciser l’interface a implementer pendant la generation existe depuis Angular 8

Angular-cli ne propose pas l’interface CanDeactivate

On va specifier l’interface CanActivate puis on modifie

Executons la commande suivante

ng g g guards/leave

Le resultat

CREATE src/app/guards/leave.guard.spec.ts (352 bytes) CREATEsrc/app/guards/leave.guard.ts (472 bytes)

H & H: Research and Training 14 / 19

Page 22: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Code genere

@Injectable({providedIn: ’root’

})export class LeaveGuard implements CanActivate {canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree>

| Promise<boolean | UrlTree> | boolean | UrlTree {return true;

}}

Ensuite

Remplacez CanActivate par CanDeactivate<FormulaireComponent>

Faites l’import pour CanDeactivate

Supprimer la methode generee pour CanActivate et ajouter la methode del’interface qu’il faut implementer

H & H: Research and Training 15 / 19

Page 23: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Code genere

@Injectable({providedIn: ’root’

})export class LeaveGuard implements CanActivate {canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree>

| Promise<boolean | UrlTree> | boolean | UrlTree {return true;

}}

Ensuite

Remplacez CanActivate par CanDeactivate<FormulaireComponent>

Faites l’import pour CanDeactivate

Supprimer la methode generee pour CanActivate et ajouter la methode del’interface qu’il faut implementer

H & H: Research and Training 15 / 19

Page 24: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Nouveau code

@Injectable({providedIn: ’root’

})export class LeaveGuard implements CanDeactivate<FormulaireComponent> {canDeactivate(component: FormulaireComponent,

currentRoute: ActivatedRouteSnapshot,currentState: RouterStateSnapshot,nextState?: RouterStateSnapshot): boolean {

throw new Error("Method not implemented.");}

}

Objectif

On ajoute le lien suivant dans formulaire.component.html :

<a routerLink=’/personne’>aller ailleurs</a>

Si l’utilisateur remplit les deux champs nom et prenom dansformulaire.component.html et clique sur le lien pour aller sur le composantpersonne, on lui demande une confirmation.

H & H: Research and Training 16 / 19

Page 25: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Nouveau code

@Injectable({providedIn: ’root’

})export class LeaveGuard implements CanDeactivate<FormulaireComponent> {canDeactivate(component: FormulaireComponent,

currentRoute: ActivatedRouteSnapshot,currentState: RouterStateSnapshot,nextState?: RouterStateSnapshot): boolean {

throw new Error("Method not implemented.");}

}

Objectif

On ajoute le lien suivant dans formulaire.component.html :

<a routerLink=’/personne’>aller ailleurs</a>

Si l’utilisateur remplit les deux champs nom et prenom dansformulaire.component.html et clique sur le lien pour aller sur le composantpersonne, on lui demande une confirmation.

H & H: Research and Training 16 / 19

Page 26: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

Angular

Modifions la garde

@Injectable({providedIn: ’root’

})export class LeaveGuard implements CanDeactivate<FormulaireComponent> {canDeactivate(component: FormulaireComponent,

currentRoute: ActivatedRouteSnapshot,currentState: RouterStateSnapshot,nextState?: RouterStateSnapshot): boolean {

return component.personne.nom === undefined ||component.personne.prenom === undefined ||component.personne.nom.length === 0 ||component.personne.prenom.length === 0 ||confirm(’voulez-vous vraiement quitter ?’);

}}

H & H: Research and Training 17 / 19

Page 27: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

AngularAssocions LeaveGuard a la route /formulaire dansapp-routing.module.ts

const routes: Routes = [// les autres routes{

path: ’adresse’,component: AdresseComponent,canActivate: [AuthGuard]

},{

path: ’formulaire’,component: FormulaireComponent,canDeactivate: [LeaveGuard]

},{ path: ’auth’, component: AuthComponent },// le reste des routes

];

H & H: Research and Training 18 / 19

Page 28: Angular : guard · 2020. 7. 26. · Angular: guard Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte (IA) Ingenieur en g´

© Achref EL MOUELHI ©

Exemple avec CanDeactivate

AngularIl est possible d’associer plusieurs guards a une route

const routes: Routes = [// les autres routes{

path: ’adresse’,component: AdresseComponent,canActivate: [AuthGuard]

},{

path: ’formulaire’,component: FormulaireComponent,canActivate: [AuthGuard],canDeactivate: [LeaveGuard],

},{ path: ’auth’, component: AuthComponent },// le reste des routes

];

H & H: Research and Training 19 / 19