Angular 如何处理权限控制

阅读时长 6 分钟读完

简介

在一个 Web 应用中,往往需要对用户的操作进行权限控制,以确保用户只能在其拥有权限的范围内进行操作。在 Angular 中,可以使用官方推荐的 Angular 路由守卫以及自定义指令来实现权限控制。

Angular 路由守卫

Angular 路由守卫可以帮助我们在用户访问某个路由之前,先判断该用户是否拥有访问该路由的权限。它可以拦截用户的路由导航,并在导航完成前执行一些操作,如判断用户是否有访问该路由的权限。

canActivate

canActivate 是一个路由守卫函数,它接收一个 ActivatedRouteSnapshot 和一个 RouterStateSnapshot 参数。前者是要求访问的路由的信息,而后者则是当前的路由状态信息。

-- -------------------- ---- -------
------ - ---------- - ---- ----------------
------ - ----------------------- -------------------- -------- ----------- - ---- ------------------
------ - ---------- - ---- -------

-------------
------ ----- --------- ---------- ----------- -
  ------------
    ----- -----------------------
    ------ --------------------- ------------------ - -------- - --------------- - -------- - ------- - ------- -
    -- --------
    ------ ----- -- -- ----- ----------
  -

-

canActivateChild

canActivateChild 与 canActivate 类似,不同的是它可以用于保护子路由。

canLoad

canLoad 最终由路由进行调用。它通过静态导入模块而不是通过路由加载模块,以提高安全性。如果用户没有访问权限,就不会加载模块。

-- -------------------- ---- -------
------ - ---------- - ---- ----------------
------ - -------- ------ ---------- - ---- ------------------
------ - ---------- - ---- -------

-------------
------ ----- ------------- ---------- ------- -
  --------
    ------ ------
    --------- -------------- ------------------- - ---------------- - ------- -
    -- --------
    ------ ----- -- -- ----------------
  -
-

如何使用

可以在应用的路由配置中直接使用 canActivate、canActivateChild 和 canLoad 作为路由守卫。

-- -------------------- ---- -------
----- ------- ------ - -
  - ----- --- ---------- ------------- --
  - ----- ------------ ---------- ------------------- ------------ ----------- --
  -
    ----- --------
    ---------- ---------------
    ----------------- ------------
    --------- -
      - ----- --- ---------- ------------------ --
      - ----- -------- ---------- -------------- --
      - ----- ----------- ---------- ----------------- -
    -
  --
  - ----- ------- ------------- -- -- ----------------------------------- -- -------------- -------- --------------- --
  - ----- ----- ---------- ----------------- -
--

在这个例子中,AuthGuard 将会拦截 dashboard、admin 路由和 canLoad。

自定义指令

使用自定义指令来控制页面元素的显示与隐藏是 Angular 中的常见做法。利用这个特点,我们可以在拥有特定权限时,显示该元素。

-- -------------------- ---- -------
------ - ---------- ------ ------- ------------ ---------------- - ---- ----------------

------ - ----------- - ---- -----------------

------------
  --------- -----------------
--
------ ----- ---------------------- ---------- ------ -
  -------- -------------- -------

  ------------
    ------- ------------ ------------
    ------- ------------ -----------------
    ------- ----------------- ----------------
  - --

  ---------- -
    -- ---------------------------------------------------- -
      -----------------------------------------------------------
    - ---- -
      ------------------------------
    -
  -
-

在这个例子中,我们自定义了一个指令,它接受一个名为“hasPermission”的输入属性,并根据 AuthService 中的 hasPermission() 方法的返回值来控制该指令所在的元素的显示与隐藏。

我们可以在 HTML 文件中使用 *hasPermission="'permissionName'" 的方式将自定义指令使用到某个页面元素上。

总结

通过利用 Angular 的路由守卫和自定义指令,我们可以方便地实现权限控制功能。其中,Angular 路由守卫可以帮助我们在用户访问某个路由之前,先判断该用户是否拥有访问该路由的权限。自定义指令则可以控制某个元素在拥有特定权限时的显示与隐藏。

示例代码

本文所有实例代码放在了 GitHub 仓库中,欢迎查看:https://github.com/gilbertchuang/angular-permission-control

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499553e48841e989465423e

纠错
反馈