Angular5路由守衛
1、AuthService.ts
import { Injectable } from '@angular/core';
@Injectable()
export class AuthService {
// store the URL so we can redirect after logging in
redirectUrl: string;
login(user: string, password: string): boolean {
if (user === 'user' && password === 'password') {
localStorage.setItem('username', user);
return true;
}
return false;
}
logout(): any {
localStorage.removeItem('username');
}
getUser(): any {
return localStorage.getItem('username');
}
isLoggedIn(): boolean {
return this.getUser() !== null;
}
}
export var AUTH_PROVIDERS: Array<any> = [
{ provide: AuthService, useClass: AuthService }
];
2、SigninComponent
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms';
import {AuthService} from './../../AuthService';
@Component({
selector: 'app-signin',
templateUrl: './signin.component.html',
styleUrls: ['./signin.component.scss']
})
export class SigninComponent implements OnInit {
public form: FormGroup;
message: string;
constructor(private fb: FormBuilder, private router: Router, private authService: AuthService) {
this.message = '';
}
ngOnInit() {
this.form = this.fb.group ( {
uname: [null , Validators.compose ( [ Validators.required ] )] , password: [null , Validators.compose ( [ Validators.required ] )]
} );
}
onSubmit() {
this.message = '';
// if (!this.authService.login('user', 'password')) {
if (!this.authService.login(this.form.get("uname").value, this.form.get("password").value)) {
alert("使用者名稱或密碼錯誤!");
this.message = 'Incorrect credentials.';
setTimeout(function() {
this.message = '';
}.bind(this), 2500);
} else {
// this.router.navigate ( [ 'dashboard' ] );
this.router.navigate(['/dashboard']);
}
return false;
}
logout(): boolean {
this.authService.logout();
return false;
}
}
3、signin.component.html
<div class="session mat-indigo">
<div class="session-content">
<div class="session-wrapper">
<mat-card>
<mat-card-content>
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="text-xs-center pb-1">
<img src="assets/images/logo-dark.svg" alt=""/>
<p class="mat-text-muted">登入系統</p>
</div>
<div fxLayout="column" fxLayoutAlign="space-around">
<div class="pb-1">
<mat-form-field style="width: 100%">
<input matInput placeholder="使用者名稱" [formControl]="form.controls['uname']">
</mat-form-field>
<small *ngIf="form.controls['uname'].hasError('required') && form.controls['uname'].touched" class="mat-text-warn">使用者名稱必填</small>
</div>
<div class="pb-1">
<mat-form-field style="width: 100%">
<input matInput type="password" placeholder="密碼" [formControl]="form.controls['password']">
</mat-form-field>
<small *ngIf="form.controls['password'].hasError('required') && form.controls['password'].touched" class="mat-text-warn">密碼必填</small>
</div>
<div class="pb-1">
<mat-checkbox>保持登入</mat-checkbox>
</div>
<button mat-raised-button color="primary" type="submit" [disabled]="!form.valid">登入</button>
</div>
<div class="pt-1 pb-1 text-xs-center">
<a [routerLink]="['/session/forgot']">忘記密碼?</a>
<a [routerLink]="['/session/signup']">註冊賬號</a>
</div>
</form>
</mat-card-content>
</mat-card>
</div>
</div>
</div>
4、LoggedInGuard
import { Injectable } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot
} from '@angular/router';
import { AuthService } from './AuthService';
@Injectable()
export class LoggedInGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
// alert("url="+url);
return this.checkLogin(url);
}
checkLogin(url: string): boolean {
if (this.authService.isLoggedIn()) { return true; }
// Store the attempted URL for redirecting
this.authService.redirectUrl = url;
// Navigate to the login page with extras
// this.router.navigate(['/login']);
alert("請先登入系統!");
this.router.navigate(['/']);
return false;
}
}
5、SessionRoutes
import { Routes } from '@angular/router';
import { NotFoundComponent } from './not-found/not-found.component';
import { ErrorComponent } from './error/error.component';
import { ForgotComponent } from './forgot/forgot.component';
import { LockscreenComponent } from './lockscreen/lockscreen.component';
import { SigninComponent } from './signin/signin.component';
import { SignupComponent } from './signup/signup.component';
import {LoggedInGuard} from './../loggedIn.guard';
export const SessionRoutes: Routes = [
{
path: '',
children: [{
path: '',
redirectTo: 'signin',
pathMatch: 'full'
}, {
path: '404',
component: NotFoundComponent
}, {
path: 'error',
component: ErrorComponent
}, {
path: 'forgot',
component: ForgotComponent
}, {
path: 'lockscreen',
canActivate: [LoggedInGuard],
component: LockscreenComponent
}, {
path: 'signin',
component: SigninComponent
}, {
path: 'signup',
component: SignupComponent
}]
}
];
6、SessionModule
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { MatIconModule, MatCardModule, MatInputModule, MatCheckboxModule, MatButtonModule } from '@angular/material';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { FlexLayoutModule } from '@angular/flex-layout';
import { SessionRoutes } from './session.routing';
import { NotFoundComponent } from './not-found/not-found.component';
import { ErrorComponent } from './error/error.component';
import { ForgotComponent } from './forgot/forgot.component';
import { LockscreenComponent } from './lockscreen/lockscreen.component';
import { SigninComponent } from './signin/signin.component';
import { SignupComponent } from './signup/signup.component';
import {LocationStrategy, HashLocationStrategy} from '@angular/common';
import {AUTH_PROVIDERS} from './../AuthService';
import {LoggedInGuard} from './../loggedIn.guard';
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(SessionRoutes),
MatIconModule,
MatCardModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
FlexLayoutModule,
FormsModule,
ReactiveFormsModule
],
declarations: [
NotFoundComponent,
ErrorComponent,
ForgotComponent,
LockscreenComponent,
SigninComponent,
SignupComponent
],
providers: [
AUTH_PROVIDERS,
LoggedInGuard,
{ provide: LocationStrategy, useClass: HashLocationStrategy }
]
})
export class SessionModule {}
7、AppModule
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { LoadingBarRouterModule } from '@ngx-loading-bar/router';
import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
import { PERFECT_SCROLLBAR_CONFIG } from 'ngx-perfect-scrollbar';
import { PerfectScrollbarConfigInterface } from 'ngx-perfect-scrollbar';
import { AgmCoreModule } from '@agm/core';
import {
MatSidenavModule,
MatCardModule,
MatMenuModule,
MatCheckboxModule,
MatIconModule,
MatButtonModule,
MatToolbarModule,
MatTabsModule,
MatListModule,
MatSlideToggleModule,
MatSelectModule,
MatProgressBarModule } from '@angular/material';
import { FlexLayoutModule } from '@angular/flex-layout';
import {BidiModule} from '@angular/cdk/bidi';
import {
MenuComponent,
HeaderComponent,
SidebarComponent,
NotificationComponent,
OptionsComponent,
AdminLayoutComponent,
AuthLayoutComponent,
AccordionAnchorDirective,
AccordionLinkDirective,
AccordionDirective} from './core';
import { AppRoutes } from './app.routing';
import { AppComponent } from './app.component';
import { SessionModule } from './session/session.module';
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
suppressScrollX: true,
wheelSpeed: 2,
wheelPropagation: true,
minScrollbarLength: 20
};
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
SidebarComponent,
NotificationComponent,
OptionsComponent,
MenuComponent,
AdminLayoutComponent,
AuthLayoutComponent,
AccordionAnchorDirective,
AccordionLinkDirective,
AccordionDirective,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
RouterModule.forRoot(AppRoutes),
FormsModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
LoadingBarRouterModule,
MatSidenavModule,
MatCardModule,
MatMenuModule,
MatCheckboxModule,
MatIconModule,
MatButtonModule,
MatToolbarModule,
MatTabsModule,
MatListModule,
MatSlideToggleModule,
MatSelectModule,
MatProgressBarModule,
FlexLayoutModule,
BidiModule,
AgmCoreModule.forRoot({apiKey: 'YOURAPIKEY'}),
PerfectScrollbarModule,
SessionModule
],
providers: [
{
provide: PERFECT_SCROLLBAR_CONFIG,
useValue: DEFAULT_PERFECT_SCROLLBAR_CONFIG
}
],
bootstrap: [AppComponent]
})
export class AppModule { }