diff options
author | crupest <crupest@outlook.com> | 2019-03-11 23:21:44 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-03-11 23:21:44 +0800 |
commit | 435c2b4e68c06bc2d03b209a3dba0b8918f3bf8c (patch) | |
tree | d2e6c416c4ab972097608e391ff293bb758fbbdd /Timeline | |
parent | 4535d1fd30eb02b3fe60718235a0725e3b30049e (diff) | |
download | timeline-435c2b4e68c06bc2d03b209a3dba0b8918f3bf8c.tar.gz timeline-435c2b4e68c06bc2d03b209a3dba0b8918f3bf8c.tar.bz2 timeline-435c2b4e68c06bc2d03b209a3dba0b8918f3bf8c.zip |
Add auth guard.
Diffstat (limited to 'Timeline')
-rw-r--r-- | Timeline/ClientApp/src/app/user/auth.guard.spec.ts | 15 | ||||
-rw-r--r-- | Timeline/ClientApp/src/app/user/auth.guard.ts | 62 | ||||
-rw-r--r-- | Timeline/ClientApp/src/app/user/user.module.ts | 9 |
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, |