1. 程式人生 > 實用技巧 >Angular路由守衛

Angular路由守衛

路由守衛

簡介

目前,任何使用者都能在任何時候導航到任何地方,對於大部分應用,這樣是存在安全問題的,某些使用者可能無權導航到目標元件,需要先登入(認證)

在顯示目標元件前,可能需要先獲取某些資料。

在離開元件前,可能要先儲存修改.需要詢問使用者:是否要放棄本次更改,而不用儲存它們?

對於上述這些場景問題,往往需要在路由配置中新增守衛,進行處理.

返回值

守衛通過返回一個值,以控制路由器的行為:

  • 如果它返回 true,導航過程會繼續

  • 如果它返回 false,導航過程就會終止,且使用者留在原地。

  • 如果它返回 UrlTree,則取消當前的導航,並且開始導航到返回的這個 UrlTree.

守衛還可以告訴路由器導航到別處,這樣也會取消當前的導航。要想在守衛中這麼做,就要返回 false;

守衛可以用同步的方式返回一個布林值,但在很多情況下,守衛無法用同步的方式給出答案.守衛可能會向用戶問一個問題、把更改儲存到伺服器,或者獲取新資料,而這些都是非同步操作。因此,路由的守衛可以返回一個Observable Promise,並且路由器會等待這個可觀察物件被解析為true或false。

提供給路由器的可觀察物件還必須能結束,否則,導航就不會繼續.

守衛介面

路由器可以支援多種守衛介面:

* 用CanActivate來處理導航到某路由的情況。
  • 用CanActivateChild來處理導航到某子路由的情況。

  • 用CanDeactivate來處理從當前路由離開的情況.

  • 用Resolve在路由啟用之前獲取路由資料。

  • 用CanLoad來處理非同步導航到某特性模組的情況。

在分層路由的每個級別上,你都可以設定多個守衛,上面提到過的空路由,在這裡會可能發揮很好的作用

路由器會先按照從最深的子路由 由下往上檢查的順序來檢查CanDeactivate() 和CanActivateChild() 守衛.然後它會按照從上到下的順序檢查CanActivate()守衛. 如果特性模組是非同步載入的,在載入它之前還會檢查CanLoad()守衛. 如果任何一個守衛返回 false,其它尚未完成的守衛會被取消,這樣整個導航就被取消.

使用

  • 生成一個守衛
//新增一個auth守衛
ng generate guard auth    (簡寫ng g g auth/auth)

生成的守衛會自動實現canactivate,若非同步載入模組的,還需要實現CanLoad
在守衛裡進行安全的邏輯設定,可以用與服務結合實現

export class AuthGuard implements CanActivate{}
  • 新增進路由(假設訪問info介面需要登入)
{ path: 'info', canActivate: [AuthGuard], component: WorkComponent },