fixed guard order

This commit is contained in:
Timo Bejan 2020-10-20 11:21:51 +03:00
parent e046c74da0
commit 88af991b36
3 changed files with 34 additions and 22 deletions

View File

@ -18,7 +18,6 @@ export class AuthGuard extends KeycloakAuthGuard {
}
public async isAccessAllowed(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (!this.authenticated) {
await this._keycloak.login({
redirectUri: window.location.origin + state.url,
@ -26,8 +25,7 @@ export class AuthGuard extends KeycloakAuthGuard {
}
await this._userService.loadCurrentUser();
console.log(this._userService.user);
return true;
}
}

View File

@ -1,30 +1,37 @@
import {Injectable} from "@angular/core";
import {ActivatedRouteSnapshot, Router, RouterStateSnapshot} from "@angular/router";
import {KeycloakAuthGuard, KeycloakService} from "keycloak-angular";
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from "@angular/router";
import {KeycloakService} from "keycloak-angular";
import {UserService} from "../user/user.service";
import {AppLoadStateService} from "../utils/app-load-state.service";
import {Observable} from "rxjs";
class UrlTree {
}
@Injectable({
providedIn: 'root',
})
export class RedRoleGuard extends KeycloakAuthGuard {
export class RedRoleGuard implements CanActivate {
constructor(
protected readonly _router: Router,
protected readonly _keycloak: KeycloakService,
private readonly _appLoadStateService: AppLoadStateService,
private readonly _userService: UserService
) {
super(_router, _keycloak);
}
public async isAccessAllowed(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (!this._userService.user.hasAnyREDRoles) {
this._router.navigate(['/auth-error']);
this._appLoadStateService.pushLoadingEvent(false);
return false;
}
return true;
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return new Observable(obs => {
if (!this._userService.user.hasAnyREDRoles) {
this._router.navigate(['/auth-error']);
this._appLoadStateService.pushLoadingEvent(false);
obs.next(false);
obs.complete();
} else {
obs.next(true);
obs.complete();
}
})
}
}

View File

@ -1,7 +1,7 @@
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router';
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router';
import {Injectable, Injector} from '@angular/core';
import {Observable, of} from 'rxjs';
import {catchError, mergeMap, tap} from 'rxjs/operators';
import {from, Observable, of} from 'rxjs';
import {catchError, map, mergeMap, tap} from 'rxjs/operators';
import {AppLoadStateService} from "./app-load-state.service";
@Injectable({
@ -21,14 +21,21 @@ export class CompositeRouteGuard implements CanActivate {
if (routeGuards) {
for (let i = 0; i < routeGuards.length; i++) {
const routeGuard = this._injector.get(routeGuards[i]);
const canActivateObservable: Observable<boolean> = routeGuard.canActivate(route, state);
const routeGuard = this._injector.get<CanActivate>(routeGuards[i]);
let canActivateResult = routeGuard.canActivate(route, state);
if (canActivateResult instanceof Promise) {
canActivateResult = from(canActivateResult);
}
if (typeof canActivateResult === 'boolean' || canActivateResult instanceof UrlTree) {
canActivateResult = of(canActivateResult);
}
const canActivatePipe: Observable<boolean> = canActivateResult.pipe(map(m => !!m));
compositeCanActivateObservable = compositeCanActivateObservable.pipe(
mergeMap(bool => {
if (!bool) {
return of(false);
} else {
return canActivateObservable;
return canActivatePipe;
}
})
);