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.ts62
1 files changed, 62 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/user/auth.guard.ts b/Timeline/ClientApp/src/app/user/auth.guard.ts
new file mode 100644
index 00000000..16f66cd8
--- /dev/null
+++ b/Timeline/ClientApp/src/app/user/auth.guard.ts
@@ -0,0 +1,62 @@
+import { Injectable } from '@angular/core';
+import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
+import { Observable } from 'rxjs';
+
+import { UserService } from './user.service';
+
+export type RequiredAuthData = 'all' | 'requirelogin' | 'requirenologin' | string[];
+
+export abstract class AuthGuard implements CanActivate {
+
+ constructor(private userService: UserService) { }
+
+ abstract get requiredAuth(): RequiredAuthData;
+
+ canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot):
+ Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
+
+ const { requiredAuth } = this;
+
+ if (requiredAuth === 'all') {
+ return true;
+ }
+ const { currentUserInfo } = this.userService;
+
+ if (currentUserInfo === null) {
+ return requiredAuth === 'requirenologin';
+ } else {
+ if (requiredAuth === 'requirelogin') {
+ return true;
+ } else if (requiredAuth === 'requirenologin') {
+ return false;
+ } else {
+ const { roles } = currentUserInfo;
+ return requiredAuth.every(value => roles.includes(value));
+ }
+ }
+ }
+}
+
+@Injectable({
+ providedIn: 'root'
+})
+export class RequireLoginGuard extends AuthGuard {
+ readonly requiredAuth: RequiredAuthData = 'requirelogin';
+
+ // never remove this constructor or you will get an injection error.
+ constructor(userService: UserService) {
+ super(userService);
+ }
+}
+
+@Injectable({
+ providedIn: 'root'
+})
+export class RequireNoLoginGuard extends AuthGuard {
+ readonly requiredAuth: RequiredAuthData = 'requirenologin';
+
+ // never remove this constructor or you will get an injection error.
+ constructor(userService: UserService) {
+ super(userService);
+ }
+}