Angular入門到精通系列教程(13)- 路由守衛(Route Guards)
環境:
- Angular CLI: 11.0.6
- Angular: 11.0.7
- Node: 12.18.3
- npm : 6.14.6
- IDE: Visual Studio Code
1. 摘要
在我們的實際的業務開發過程中,我們經常會遇到如下需求:
- 需要限制某些 URL 的可訪問性,例如,對于系統管理界面,只有那些擁有管理員權限的用戶才能打開。
- 當用戶處于編輯界面時,在沒有保存就離開時,需要提示用戶是否放棄修改。
針對以上場景,Angualr使用路由守衛(Route Guards)來實現。
2. 路由守衛(Route Guards)
2.1. 創建路由守衛
Angular CLI提供了命令行工具,可以快速創建路由守衛框架文件:ng generate guard auth。 執行后,Angular CLI會問我們需要實現哪些接口,我們直接勾選即可:
? Which interfaces would you like to implement? (Press <space> to select, <a> to toggle all, <i> to invert selection)
>(*) CanActivate
( ) CanActivateChild
( ) CanDeactivate
( ) CanLoad
說明:
- CanActivate: 控制路由是否可以激活
- CanActivateChild: 控制子路由是否可以激活
- CanDeactivate: 控制路由是否可以退出
- CanLoad: 控制模塊(module)是否可以被加載
比較經常使用的是1、3,分別控制進入和退出。 按照上面配置,AngularCLI自動生成如下代碼,return true; 替換為我們實際的代碼即可。return false; 表示不允許跳轉,或者取消離開當前頁面。
// auth.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate, CanDeactivate<unknown> {
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return true;
}
}
在canActivate方法中,我們還可以使用跳轉。如頁面判斷是否已經登錄,如果沒有登錄,跳轉到Login頁面:
this.router.navigate(['/login']);
return false;
2.2. 控制路由是否可以激活
控制路由是否可以激活,需要定義在定義路由的地方,增加canActivate屬性。如果需要,還可以增加data屬性, 比如告訴我們的AuthGuard進入當前路由需要驗證哪些權限。data屬性是可選的。
const routes: Routes = [
{
path: "page1",
component: Page1Component,
data: { permissions: ['YourPage1Permission'] }, // 傳入參數給AuthGuard,可選
canActivate: [AuthGuard]
},
{
path: "page2",
component: Page2omponent,
data: { permissions: ['YourPage2Permission'] }, // 傳入參數給AuthGuard,可選
canActivate: [AuthGuard]
}
]
2.3. 控制路由是否退出(離開)
和控制路由是否可以激活類似,在路由定義出增加 canDeactivate,并制定相應的Guard守衛即可。這里不再舉例
3. 總結
- 通過路由守衛(Route Guards)實現控制URL的進入和離開;
- Angular CLI可以輔助我們創建guard文件;
---------------- END ----------------
======================
浙公網安備 33010602011771號