aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/user/auth.guard.ts
diff options
context:
space:
mode:
Diffstat (limited to 'Timeline/ClientApp/src/app/user/auth.guard.ts')
-rw-r--r--Timeline/ClientApp/src/app/user/auth.guard.ts59
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']);
+ }
}