@ -4,10 +4,11 @@ import {
CanActivateFn ,
CanActivateFn ,
Router ,
Router ,
RouterStateSnapshot ,
RouterStateSnapshot ,
UrlTree ,
} from '@angular/router' ;
} from '@angular/router' ;
import { HttpErrorResponse } from '@angular/common/http' ;
import { HttpErrorResponse } from '@angular/common/http' ;
import { Observable , of } from 'rxjs' ;
import { Observable , of } from 'rxjs' ;
import { filter , take , tap } from 'rxjs/operators' ;
import { map , take } from 'rxjs/operators' ;
import { AuthService , IAbpGuard } from '../abstracts' ;
import { AuthService , IAbpGuard } from '../abstracts' ;
import { findRoute , getRoutePath } from '../utils/route-utils' ;
import { findRoute , getRoutePath } from '../utils/route-utils' ;
import { RoutesService , PermissionService , HttpErrorReporterService } from '../services' ;
import { RoutesService , PermissionService , HttpErrorReporterService } from '../services' ;
@ -25,7 +26,7 @@ export class PermissionGuard implements IAbpGuard {
protected readonly permissionService = inject ( PermissionService ) ;
protected readonly permissionService = inject ( PermissionService ) ;
protected readonly httpErrorReporter = inject ( HttpErrorReporterService ) ;
protected readonly httpErrorReporter = inject ( HttpErrorReporterService ) ;
canActivate ( route : ActivatedRouteSnapshot , state : RouterStateSnapshot ) : Observable < boolean > {
canActivate ( route : ActivatedRouteSnapshot , state : RouterStateSnapshot ) : Observable < boolean | UrlTree > {
let { requiredPolicy } = route . data || { } ;
let { requiredPolicy } = route . data || { } ;
if ( ! requiredPolicy ) {
if ( ! requiredPolicy ) {
@ -38,12 +39,19 @@ export class PermissionGuard implements IAbpGuard {
}
}
return this . permissionService . getGrantedPolicy $ ( requiredPolicy ) . pipe (
return this . permissionService . getGrantedPolicy $ ( requiredPolicy ) . pipe (
filter ( Boolean ) ,
take ( 1 ) ,
take ( 1 ) ,
tap ( access = > {
map ( access = > {
if ( ! access && this . authService . isAuthenticated ) {
if ( access ) return true ;
if ( route . data ? . [ 'redirectUrl' ] ) {
return this . router . parseUrl ( route . data [ 'redirectUrl' ] ) ;
}
if ( this . authService . isAuthenticated ) {
this . httpErrorReporter . reportError ( { status : 403 } as HttpErrorResponse ) ;
this . httpErrorReporter . reportError ( { status : 403 } as HttpErrorResponse ) ;
}
}
return false ;
} ) ,
} ) ,
) ;
) ;
}
}
@ -77,12 +85,19 @@ export const permissionGuard: CanActivateFn = (
}
}
return permissionService . getGrantedPolicy $ ( requiredPolicy ) . pipe (
return permissionService . getGrantedPolicy $ ( requiredPolicy ) . pipe (
filter ( Boolean ) ,
take ( 1 ) ,
take ( 1 ) ,
tap ( access = > {
map ( access = > {
if ( ! access && authService . isAuthenticated ) {
if ( access ) return true ;
if ( route . data ? . [ 'redirectUrl' ] ) {
return router . parseUrl ( route . data [ 'redirectUrl' ] ) ;
}
if ( authService . isAuthenticated ) {
httpErrorReporter . reportError ( { status : 403 } as HttpErrorResponse ) ;
httpErrorReporter . reportError ( { status : 403 } as HttpErrorResponse ) ;
}
}
return false ;
} ) ,
} ) ,
) ;
) ;
} ;
} ;