datasurvey/src/main/webapp/app/core/auth/user-route-access.service.ts

37 lines
1.3 KiB
TypeScript

import { Injectable, isDevMode } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { AccountService } from 'app/core/auth/account.service';
import { StateStorageService } from './state-storage.service';
@Injectable({ providedIn: 'root' })
export class UserRouteAccessService implements CanActivate {
constructor(private router: Router, private accountService: AccountService, private stateStorageService: StateStorageService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.accountService.identity().pipe(
map(account => {
if (account) {
const authorities = route.data['authorities'];
if (!authorities || authorities.length === 0 || this.accountService.hasAnyAuthority(authorities)) {
return true;
}
if (isDevMode()) {
console.error('User has not any of required authorities: ', authorities);
}
this.router.navigate(['accessdenied']);
return false;
}
this.stateStorageService.storeUrl(state.url);
this.router.navigate(['/login']);
return false;
})
);
}
}