Angular入门到精通系列教程(13)- 路由守卫(Route Guards)

环境:shell

  • Angular CLI: 11.0.6
  • Angular: 11.0.7
  • Node: 12.18.3
  • npm : 6.14.6
  • IDE: Visual Studio Code

1. 摘要

在咱们的实际的业务开发过程当中,咱们常常会遇到以下需求:npm

  1. 须要限制某些 URL 的可访问性,例如,对于系统管理界面,只有那些拥有管理员权限的用户才能打开。
  2. 当用户处于编辑界面时,在没有保存就离开时,须要提示用户是否放弃修改。

针对以上场景,Angualr使用路由守卫(Route Guards)来实现。框架

2. 路由守卫(Route Guards)

2.1. 建立路由守卫

Angular CLI提供了命令行工具,能够快速建立路由守卫框架文件:ng generate guard auth。 执行后,Angular CLI会问咱们须要实现哪些接口,咱们直接勾选便可:ide

? Which interfaces would you like to implement? (Press <space> to select, <a> to toggle all, <i> to invert selection)
>(*) CanActivate
 ( ) CanActivateChild
 ( ) CanDeactivate
 ( ) CanLoad

说明:工具

  1. CanActivate: 控制路由是否能够激活
  2. CanActivateChild: 控制子路由是否能够激活
  3. CanDeactivate: 控制路由是否能够退出
  4. CanLoad: 控制模块(module)是否能够被加载

比较常常使用的是一、3,分别控制进入和退出。 按照上面配置,AngularCLI自动生成以下代码,return true; 替换为咱们实际的代码便可。return false; 表示不容许跳转,或者取消离开当前页面。this

// 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页面:spa

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守卫便可。这里再也不举例code

3. 总结

  1. 经过路由守卫(Route Guards)实现控制URL的进入和离开;
  2. Angular CLI能够辅助咱们建立guard文件;



---------------- END ----------------component






======================

相关文章
相关标签/搜索