aboutsummaryrefslogtreecommitdiff
path: root/Timeline
diff options
context:
space:
mode:
Diffstat (limited to 'Timeline')
-rw-r--r--Timeline/ClientApp/src/app/user/auth.guard.spec.ts15
-rw-r--r--Timeline/ClientApp/src/app/user/auth.guard.ts62
-rw-r--r--Timeline/ClientApp/src/app/user/user.module.ts9
3 files changed, 82 insertions, 4 deletions
diff --git a/Timeline/ClientApp/src/app/user/auth.guard.spec.ts b/Timeline/ClientApp/src/app/user/auth.guard.spec.ts
new file mode 100644
index 00000000..7ed05ee8
--- /dev/null
+++ b/Timeline/ClientApp/src/app/user/auth.guard.spec.ts
@@ -0,0 +1,15 @@
+import { TestBed, async, inject } from '@angular/core/testing';
+
+import { AuthGuard } from './auth.guard';
+
+describe('AuthGuard', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [AuthGuard]
+ });
+ });
+
+ it('should ...', inject([AuthGuard], (guard: AuthGuard) => {
+ expect(guard).toBeTruthy();
+ }));
+});
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);
+ }
+}
diff --git a/Timeline/ClientApp/src/app/user/user.module.ts b/Timeline/ClientApp/src/app/user/user.module.ts
index c399c9e0..ae842f78 100644
--- a/Timeline/ClientApp/src/app/user/user.module.ts
+++ b/Timeline/ClientApp/src/app/user/user.module.ts
@@ -2,24 +2,25 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { RouterModule } from '@angular/router';
import {
MatFormFieldModule, MatProgressSpinnerModule,
MatDialogModule, MatInputModule, MatButtonModule
} from '@angular/material';
+import { RequireNoLoginGuard, RequireLoginGuard } from './auth.guard';
import { UserDialogComponent } from './user-dialog/user-dialog.component';
import { UserLoginComponent } from './user-login/user-login.component';
import { UserLoginSuccessComponent } from './user-login-success/user-login-success.component';
import { UtilityModule } from '../utilities/utility.module';
-import { RouterModule } from '@angular/router';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@NgModule({
declarations: [UserDialogComponent, UserLoginComponent, UserLoginSuccessComponent],
imports: [
RouterModule.forChild([
- { path: 'login', component: UserLoginComponent, outlet: 'user' },
- { path: 'success', component: UserLoginSuccessComponent, outlet: 'user' }
+ { path: 'login', canActivate: [RequireNoLoginGuard], component: UserLoginComponent, outlet: 'user' },
+ { path: 'success', canActivate: [RequireLoginGuard], component: UserLoginSuccessComponent, outlet: 'user' }
]),
CommonModule, HttpClientModule, ReactiveFormsModule, BrowserAnimationsModule,
MatFormFieldModule, MatProgressSpinnerModule, MatDialogModule, MatInputModule, MatButtonModule,