*** Extraits de code : Authentification. ***
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot }
from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.checkLogin(url);
}
checkLogin(url: string): boolean {
if (this.authService.isLoggedIn) { return true; }
this.authService.redirectUrl = url;
this.router.navigate(['/login']);
return false;
}
}
import { Injectable } from '@angular/core';
// RxJS 6
import { Observable, of } from 'rxjs';
import { tap, delay } from 'rxjs/operators';
@Injectable()
export class AuthService {
isLoggedIn: boolean = false; // L'utilisateur est-il connecté ?
redirectUrl: string; // où rediriger l'utilisateur après l'authentification ?
// Une méthode de connexion
login(name: string, password: string): Observable<boolean> {
// Faites votre appel à un service d'authentification...
let isLoggedIn = (name === 'pikachu' && password === 'pikachu');
return of(true).pipe(
delay(1000),
tap(val => this.isLoggedIn = isLoggedIn)
);
}
// Une méthode de déconnexion
logout(): void {
this.isLoggedIn = false;
}
}
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { AuthService } from './auth.service';
import { LoginComponent } from './login.component';
@NgModule({
imports: [
RouterModule.forChild([
{ path: 'login', component: LoginComponent }
])
],
exports: [
RouterModule
],
providers: [
AuthService
]
})
export class LoginRoutingModule {}
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from './auth.service';
@Component({
selector: 'login',
template: `
<div class='row'>
<div class="col s12 m4 offset-m4">
<div class="card hoverable">
<div class="card-content center">
<span class="card-title">Page de connexion</span>
<p><em>{{message}}</em></p>
</div>
<form #loginForm="ngForm">
<div>
<label for="name">Name</label>
<input type="text" id="name" [(ngModel)]="name" name="name" required>
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" [(ngModel)]="password" name="password" required>
</div>
</form>
<div class="card-action center">
<a (click)="login()" class="waves-effect waves-light btn" *ngIf="!authService.isLoggedIn">Se connecter</a>
<a (click)="logout()" *ngIf="authService.isLoggedIn">Se déconnecter</a>
</div>
</div>
</div>
</div>
`
})
export class LoginComponent {
message: string = 'Vous êtes déconnecté. (pikachu/pikachu)';
private name: string;
private password: string;
constructor(private authService: AuthService, private router: Router) { }
// Informe l'utilisateur sur son authentfication.
setMessage() {
this.message = this.authService.isLoggedIn ?
'Vous êtes connecté.' : 'Identifiant ou mot de passe incorrect.';
}
// Connecte l'utilisateur auprès du Guard
login() {
this.message = 'Tentative de connexion en cours ...';
this.authService.login(this.name, this.password).subscribe(() => {
this.setMessage();
if (this.authService.isLoggedIn) {
// Récupère l'URL de redirection depuis le service d'authentification
// Si aucune redirection n'a été définis, redirige l'utilisateur vers la liste des pokemons.
let redirect = this.authService.redirectUrl ? this.authService.redirectUrl : '/pokemon/all';
// Redirige l'utilisateur
this.router.navigate([redirect]);
} else {
this.password = '';
}
});
}
// Déconnecte l'utilisateur
logout() {
this.authService.logout();
this.setMessage();
}
}