From 88af991b36c9b18708ecd2f73c2e768f9a25414b Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Tue, 20 Oct 2020 11:21:51 +0300 Subject: [PATCH] fixed guard order --- apps/red-ui/src/app/auth/auth.guard.ts | 4 +-- apps/red-ui/src/app/auth/red-role.guard.ts | 33 +++++++++++-------- .../src/app/utils/composite-route.guard.ts | 19 +++++++---- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/apps/red-ui/src/app/auth/auth.guard.ts b/apps/red-ui/src/app/auth/auth.guard.ts index 3e5d8f4ea..6c4d3cd47 100644 --- a/apps/red-ui/src/app/auth/auth.guard.ts +++ b/apps/red-ui/src/app/auth/auth.guard.ts @@ -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; } } diff --git a/apps/red-ui/src/app/auth/red-role.guard.ts b/apps/red-ui/src/app/auth/red-role.guard.ts index 6576473a8..eb784e3ed 100644 --- a/apps/red-ui/src/app/auth/red-role.guard.ts +++ b/apps/red-ui/src/app/auth/red-role.guard.ts @@ -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 | Promise | 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(); + } + }) } + } diff --git a/apps/red-ui/src/app/utils/composite-route.guard.ts b/apps/red-ui/src/app/utils/composite-route.guard.ts index f37ddefcd..4a1b1c77c 100644 --- a/apps/red-ui/src/app/utils/composite-route.guard.ts +++ b/apps/red-ui/src/app/utils/composite-route.guard.ts @@ -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 = routeGuard.canActivate(route, state); + const routeGuard = this._injector.get(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 = canActivateResult.pipe(map(m => !!m)); compositeCanActivateObservable = compositeCanActivateObservable.pipe( mergeMap(bool => { if (!bool) { return of(false); } else { - return canActivateObservable; + return canActivatePipe; } }) );