[Angular] Protecting Routes with Guards
前言
預設的情況下,任何user都是可以瀏覽到route有對應到的網址,這並不是一個好的情況。 通常會有需要一些權限的控管。
例如:
- user是不被允許瀏覽到某個component
- 此網址需要先登入才能使用
- 先事先取得一些資料再顯示component
- 在離開component之前先取得改變的資料
- 或者在user離開之前詢問是否要不儲存離開
以上情況,都可以在route configuration新增guards
達成我們要的目的。
目前共有五種guards可以使用
- CanActivate: to mediate navigation to a route.
- CanActivateChild: to mediate navigation to a child route.
- CanDeactivate: to mediate navigation away from the current route.
- Resolve: to perform route data retrieval before route activation.
- CanLoad: to mediate navigation to a feature module loaded asynchronously.
Guard的回傳值決定router的行為
- 回傳 true,則navigation繼續
- 回傳 false,則navigation process stops
而今天選擇CanActivate來做說明,其他guards的做法都是類似的。
原文參考:
Guards
範例
今天的範例我們要驗證使用者輸入的網址參數(:id)是不是個數字,如果不是數字,則導向到 welcome 頁面。 router設定如下:1
{ path: 'detail/:id', component: DetailComponent }
我們先用 angular cli
新增一個 service component
angular cli
會幫我們新增好一個service component,而且我們要做的就是
implements CanActivate
,實作canActivate方法- 因為要取得網址的資料,所以
canActivate傳入ActivatedRouteSnapshot
import Router
使用router做導向的動作- 驗證是否為數字,是數字回傳true,不是數字導向welcome頁面,回傳false
- ts
1 | import { CanActivate, ActivatedRouteSnapshot, Router } from '@angular/router'; |
以上,我們component的程式碼就寫完了。
接下來開啟app.module
import ProductGuardService
provider
加入 ProductGuardServicerouter
設定多傳入 canActivate : ProductGuardService
- ts
1 | ... |
加入以上程式碼後,就完成了。 這樣當網址像是數字這種非數字的id參數,則網址頁就會自動導向到welcome。