单页面应用程序(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