diff options
Diffstat (limited to 'Timeline/ClientApp/src/app/user/auth.guard.ts')
-rw-r--r-- | Timeline/ClientApp/src/app/user/auth.guard.ts | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/Timeline/ClientApp/src/app/user/auth.guard.ts b/Timeline/ClientApp/src/app/user/auth.guard.ts index 16f66cd8..64ff93c7 100644 --- a/Timeline/ClientApp/src/app/user/auth.guard.ts +++ b/Timeline/ClientApp/src/app/user/auth.guard.ts @@ -2,38 +2,47 @@ import { Injectable } from '@angular/core'; import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; -import { UserService } from './user.service'; +import { InternalUserService } from './internal-user-service/internal-user.service'; -export type RequiredAuthData = 'all' | 'requirelogin' | 'requirenologin' | string[]; +export type AuthStrategy = 'all' | 'requirelogin' | 'requirenologin' | string[]; export abstract class AuthGuard implements CanActivate { - constructor(private userService: UserService) { } + constructor(protected internalUserService: InternalUserService) { } - abstract get requiredAuth(): RequiredAuthData; + onAuthFailed() { } + + abstract get authStrategy(): AuthStrategy; canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { - const { requiredAuth } = this; + const { authStrategy } = this; - if (requiredAuth === 'all') { + if (authStrategy === 'all') { return true; } - const { currentUserInfo } = this.userService; + + const { currentUserInfo } = this.internalUserService; if (currentUserInfo === null) { - return requiredAuth === 'requirenologin'; + if (authStrategy === 'requirenologin') { + return true; + } } else { - if (requiredAuth === 'requirelogin') { + if (authStrategy === 'requirelogin') { return true; - } else if (requiredAuth === 'requirenologin') { - return false; - } else { + } else if (authStrategy instanceof Array) { const { roles } = currentUserInfo; - return requiredAuth.every(value => roles.includes(value)); + if (authStrategy.every(value => roles.includes(value))) { + return true; + } } } + + // reach here means auth fails + this.onAuthFailed(); + return false; } } @@ -41,22 +50,30 @@ export abstract class AuthGuard implements CanActivate { providedIn: 'root' }) export class RequireLoginGuard extends AuthGuard { - readonly requiredAuth: RequiredAuthData = 'requirelogin'; + readonly authStrategy: AuthStrategy = 'requirelogin'; // never remove this constructor or you will get an injection error. - constructor(userService: UserService) { - super(userService); - } + constructor(internalUserService: InternalUserService) { + super(internalUserService); + } + + onAuthFailed() { + this.internalUserService.userRouteNavigate(['login', { reason: 'nologin' }]); + } } @Injectable({ providedIn: 'root' }) export class RequireNoLoginGuard extends AuthGuard { - readonly requiredAuth: RequiredAuthData = 'requirenologin'; + readonly authStrategy: AuthStrategy = 'requirenologin'; // never remove this constructor or you will get an injection error. - constructor(userService: UserService) { - super(userService); - } + constructor(internalUserService: InternalUserService) { + super(internalUserService); + } + + onAuthFailed() { + this.internalUserService.userRouteNavigate(['success']); + } } |