angular guard

Angular Router Guard

楊芷綺 2022/01/05 10:11:13
61

Angular 中提供了以下路由守衛:

CanActivate

CanActivateChild

CanDeactivate

Resolve

CanLoad

下面的例子使用 CanActivate: 

首先先建立守衛

ng generate guard auth

auth guard 程式如下

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private router: Router) { }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot) {
    window.alert('沒有權限將跳轉至首頁')
    this.router.navigate(['/home']);
    return false;
  }
}

接著在 app-routing page1 頁面 引用 auth-guard

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard } from './core/guards/auth.guard';
import { HomeComponent } from './home/home.component';
import { PageOneComponent } from './page-one/page-one.component';
import { PageTwoComponent } from './page-two/page-two.component';

const routes: Routes = [
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  {
    path: 'home',
    component: HomeComponent,
  },
  {
    path: 'page1',
    component: PageOneComponent,
    canActivate: [AuthGuard]
  },
  {
    path: 'page2',
    component: PageTwoComponent
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

當點擊 page1 連結時觸發路由守衛

結果: 路由首位返回 false, 因此並未導頁 page1, 而是導頁至首頁

接著點擊 page2 連結

結果: 此頁面並未引用路由守衛,因此直接跳轉至 page2

小結: 範例成功地建立了一個路由守衛,使得沒權限的人不能進入 page1,透過簡單的範例,我們可以觀察到當沒權限時是否正確導航到指定目的地。

 

參考資料: https://angular.tw/api/router/CanActivate

楊芷綺