ciao!
in un'applicazione angular controllo la possibilità di visualizzare le pagine tramite una guard:
codice:
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private router: Router, private authService: AuthService) {
}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (!this.authService.isLoggedIn()) {
return this.router.parseUrl('/login');
}
return true;
}
canActivateChild(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (!this.authService.isLoggedIn()) {
return this.router.parseUrl('/login');
}
return true;
}
}
funziona bene.
se non si è fatto il login, non si può accedere alle pagina.
ora però se, dopo aver effettuato il login, apro una pagina in un'altra scheda, devo rifare il login.
anche se nella prima scheda il login non è scaduto.
secondo voi è possibile evitare questa cosa?
questo l'authservice:
codice:
@Injectable({
providedIn: 'root',
})
export class AuthService {
private baseUrl: string = environment.baseUrl;
constructor(private http: HttpClient, private router: Router) {
}
getUserId = () => {
return sessionStorage.getItem('id');
}
getUserName = () => {
return sessionStorage.getItem('name');
}
getToken = () => {
return sessionStorage.getItem('access_token');
}
getRuolo = () => {
return sessionStorage.getItem('ruolo');
}
isLoggedIn = () => {
const token = sessionStorage.getItem('access_token');
return !_.isEmpty(token);
}
doLogin(credenziali: Credenziali): Observable<LoginResponse> {
return this.http.post(`${this.baseUrl}/auth/login`, credenziali).pipe(
map((res: LoginResponse) => {
this.setSessionStorage(res);
return res;
})
);
}
logout(): void {
this.http.post(`${this.baseUrl}/auth/logout`, {}).subscribe(() => {
sessionStorage.clear();
this.router.navigate(['/login']);
});
}
recoveryPwd(email: string): Observable<any> {
return this.http.get(`${this.baseUrl}/auth/recovery_pwd/${email}`).pipe(
map((res: any) => res)
);
}
private setSessionStorage = (data: any) => {
Object.keys(data).forEach((item) => {
if (data[item] !== null && typeof data[item] === 'object') {
this.setSessionStorage(data[item]);
} else {
sessionStorage.setItem(item, data[item]);
}
});
};
}