J'ai mon application en marche avec Angular 2.1.0. Les itinéraires sont protégés via des gardes de routeur, canActivate.
Lorsque vous pointez le navigateur sur une zone protégée telle que "localhost: 8080/clients", je suis redirigé vers ma page de connexion, comme prévu.
Mais après une connexion réussie, j'aimerais être redirigé vers l'URL d'appel ("/ clients" dans ce cas).
Le code pour gérer la connexion ressemble à ceci
login(event, username, password) {
event.preventDefault();
var success = this.loginService.login(username, password);
if (success) {
console.log(this.router);
this.router.navigate(['']);
} else {
console.log("Login failed, display error to user");
}
}
Le problème est que je ne sais pas comment mettre la main sur l’URL d’appel depuis la méthode de connexion.
J'ai trouvé une question (et une réponse) à ce sujet, mais je n'y comprenais rien. redirection angulaire2 après la connexion
Il y a un bon exemple dans Angular Docs, Apprendre à authentifier Authguard . En gros, l'idée est d'utiliser votre AuthGuard pour vérifier votre statut de connexion et stocker l'URL sur votre AuthService Une partie du code est sur l'URL ci-dessus.
AuthGuard
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; }
// Store the attempted URL for redirecting
this.authService.redirectUrl = url;
// Navigate to the login page with extras
this.router.navigate(['/login']);
return false;
}
}
AuthService ou votre LoginService
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Router } from '@angular/router';
@Injectable()
export class AuthService {
isLoggedIn: boolean = false;
// store the URL so we can redirect after logging in
public redirectUrl: string;
constructor (
private http: Http,
private router: Router
) {}
login(username, password): Observable<boolean> {
const body = {
username,
password
};
return this.http.post('api/login', JSON.stringify(body)).map((res: Response) => {
// do whatever with your response
this.isLoggedIn = true;
if (this.redirectUrl) {
this.router.navigate([this.redirectUrl]);
this.redirectUrl = null;
}
}
}
logout(): void {
this.isLoggedIn = false;
}
}
Je pense que cela vous donnera une idée du fonctionnement, bien sûr vous devrez probablement vous adapter à votre code
Ce code traitera votre demande:
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService,
private router: Router) {
}
canActivate(next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isVerified
.take(1)
.map((isVerified: boolean) => {
if (!isVerified) {
this.router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
return false;
// return true;
}
return true;
});
}
}
mais sachez que les paramètres d'URL ne passeront pas avec l'URL !!
Vous pouvez trouver un tutoriel Nice ici: http://jasonwatmore.com/post/2016/12/08/angular-2-redirect-to-previous-url-after-login-with -auth-guard