AngularJS SPA 应用中的路由保护及鉴权实现方法

阅读时长 8 分钟读完

单页面应用程序(SPA)通常采用 AngularJS 等前端框架来实现路由,因而需要保护路由,以防止未经授权的用户访问敏感内容。本文将介绍 AngularJS 应用中的路由保护和鉴权实现方法。

路由保护

路由保护指的是通过程序的方式限制用户访问某些资源。绝大多数 SPA 应用采用前端路由技术,AngularJS 也不例外。因此,我们可以采用以下两种方式来保护路由。

1. 路由拦截器

路由拦截器可以在用户访问路由之前拦截请求,进行鉴权等操作,例如:

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

上述代码中,我们通过 $routeProvider.when 方法设置如下路由规则:

  • 如果用户访问 /dashboard,则加载 dashboard.html 模版,使用 DashboardController 控制器,并调用 AuthService.authenticate() 进行鉴权。
  • 如果用户访问其他路由,则跳转到 /login

同时,我们通过 $httpProvider.interceptors.push 注册了 responseError 拦截器,如果服务器返回 401 状态码,则跳转到 /login 页面。

2. 路由事件

路由事件是 AngularJS 提供的一种机制,可以在路由变化时执行回调函数。通过在 $rootScope 上监听路由事件,我们可以在用户访问路由之前执行相应的鉴权操作。

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

上述代码中,我们通过在 $rootScope 上注册 $routeChangeStart 事件,在用户访问路由之前执行回调函数。如果用户未经授权,则跳转到 /login 页面。

鉴权实现

鉴权实现是指验证用户身份是否合法。本文介绍两种鉴权实现方式。

1. 基于 Token 的鉴权

基于 Token 的鉴权方式是目前最为流行的一种鉴权方式。在用户登录后,服务器返回一个 Token,客户端将 Token 保存在本地存储中,在后续操作中将 Token 添加到请求头中,服务器通过验证 Token 来判断用户是否合法。

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

上述代码中,我们在 getToken 方法中发送对 /api/auth/token 路径的 POST 请求,服务器验证用户名和密码后返回一个 Token。在 isAuthenticated 方法中判断是否已经获得了 Token。

2. 基于 Cookie 的鉴权

基于 Cookie 的鉴权方式是传统的鉴权方式。在用户登录后,服务器在响应头中设置一个名为 Set-Cookie 的 Cookie,在后续操作中浏览器会自动将 Cookie 添加到请求头中,服务器通过验证 Cookie 来判断用户是否合法。

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

上述代码中,我们在 getToken 方法中发送对 /api/login 路径的 POST 请求,服务器验证用户名和密码后返回一个 Token。在 isAuthenticated 方法中发送对 /api/isAuthenticated 路径的 GET 请求,服务器返回 isAuthenticated 值,判断是否已获得 Cookie。如果未获得则调用 getToken 方法获得 Cookie。在 authenticate 方法中判断是否已经获得了 Cookie。

总结

本文介绍了路由保护和鉴权实现的两种方式,同时给出了代码示例。通过对 AngularJS 应用中路由保护和鉴权实现的理解,可以在实际开发中更好地保护应用安全,确保敏感内容不被未经授权的用户访问。

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

纠错
反馈