在AngularJS应用中实现认证授权

在每一个严肃的应用中,认证和授权都是非常重要的一个部分。单页应用也不例外。应用并不会将所有的数据和功能都 暴露给所有的用户。用户需要通过认证和授权来查看应用的某个特定部分,或者在应用中进行特定的行为。为了在应用中对用户进行识别,我们需要让用户进行登录。

在用户管理方面,传统的服务器端应用和单页应用的实现方式有所不同,单页应用能够和服务器通信的方式只有AJAX。对于登录和退出来说也是如此。

负责识别用户的服务器端需要暴露出一个认证断电。单页应用将会把用户输入的信息发送到这个节点进行认证。在一个基于认证系统的典型token中,这 项服务用于在认证完毕之后获取一个token或者一个包含已登录用户的名字和角色信息的对象。客户端则需要在所有的安全API中获取这个token。

由于获取toekn的行为将会多次发生,我们最好将这个token存在客户端。在Angular中,我们可以将这个值存在一个服务中,因为服务在客 户端中是一个单体。但是,如果用户刷新了页面,服务中的值将会丢失。在这种情况下,最好将值存放在一个有浏览器提供的安全存储中,在这里我们要是用的是 sessionStorage,因为它在浏览器关闭时会自动被清空。

实现登录

我们现在来看一些代码。假设我们已经实现了所有的服务器端的逻辑,并且有一个叫做api/login的REST接口进行登录认证,它将返回一个token。我们来写一个简单的服务用于用户登录。在后面我们会为这个服务逐渐添加功能:

app.factory("authenticationSvc", function($http, $q, $window) {var userInfo;function login(userName, password) {var deferred = $q.defer();$http.post("/api/login", {userName: userName,password: password}).then(function(result) {userInfo = {accessToken: result.data.access_token,userName: result.data.userName};$window.sessionStorage["userInfo"] = JSON.stringify(userInfo);deferred.resolve(userInfo);}, function(error) {deferred.reject(error);});return deferred.promise;}return {login: login};
});

在实际的代码中,你可能会想要将存储的代码重构为一个单独的服务。在这里为了简单起见,我们只是将它放在他用一个服务中。这个服务可以被一个用于处理登录功能的控制器所用。

安全路由

我们需要在应用中设置一些安全路由。如果一个用户没有登录同时想要进入到某一个安全路由中,他应该被重定向到登录页。我们可以使用路由选项中的resolve来实现这个功能。下面的代码片段展示了其中一种实现思路:

$routeProvider.when("/", {templateUrl: "templates/home.html",controller: "HomeController",resolve: {auth: ["$q", "authenticationSvc", function($q, authenticationSvc) {var userInfo = authenticationSvc.getUserInfo();if (userInfo) {return $q.when(userInfo);} else {return $q.reject({ authenticated: false });}}]}
});

resolve块可以包含多个代码块,这些代码块将会在完成时返回promise对象。为了说明,上面代码中的auth并不在框架中,而是我们自己定义的。你可以根据你的需求来进行修改。

通过或者拒绝路由的原因有很多种。在这里的情形中,你可以在解析/拒绝一个promise的时候传递一个对象。我们在服务中还没有实现getLoggedInUser()方法。它是一个很简单的方法,能够从服务中返回loggedInUser对象。

app.factory("authenticationSvc", function() {var userInfo;function getUserInfo() {return userInfo;}
});

通过上面的代码中的promise发送的想将会通过$rootScope进行广播。如果路由被解析,那么$routeChangeSuccess事件将会 被广播。然而,如果路由失败,那么事件$touteChangeError将会被广播。我们将监听$routeChangeError事件并将用户重定向 到登录页上。由于事件是在$rootScope层级上,最好在run函数中绑定事件处理器。

app.run(["$rootScope", "$location", function($rootScope, $location) {$rootScope.$on("$routeChangeSuccess", function(userInfo) {console.log(userInfo);});$rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) {if (eventObj.authenticated === false) {$location.path("/login");}});
}]);

处理页面刷新

当用户刷新页面时,服务将会失去现有状态。我们需要从浏览器的session storage中获取数据并将这些值赋值给loggerInUser变量。由于一个factory只会被调用一次,我们需要在一个初始化函数中设置这个变量,代码如下所示:

    function init() {if ($window.sessionStorage["userInfo"]) {userInfo = JSON.parse($window.sessionStorage["userInfo"]);}}init();

退出

当用户想要从应用中退出时,相应的API必须连同包含在请求头部中的token一起被调用。一旦用户退出,我们还需要清空sessionstorage中的数据。下面例子包含了一个退出函数,这个函数需要被添加到认证服务中。

function logout() {var deferred = $q.defer();$http({method: "POST",url: logoutUrl,headers: {"access_token": userInfo.accessToken}}).then(function(result) {$window.sessionStorage["userInfo"] = null;userInfo = null;deferred.resolve(result);}, function(error) {deferred.reject(error);});return deferred.promise;
}

总结

单页应用的认证方式和传统web应用的认证方式非常不同。由于主要的工作都搬到了浏览器端,用户的状态也需要存储在客户端。重要的一点是要记住用户的状态也需要的服务器端保存和进行验证,因为骇客很可能慧聪客户端窃取用户的数据。


本文译自Implementing Authentication in Angular Applications,原文地址http://www.sitepoint.com/implementing-authentication-angular-applications/

在AngularJS应用中实现认证授权相关推荐

  1. SaaS-HRM中的认证授权

    搭建环境 导入依赖 父工程导入Shiro的依赖 <!--shiro和spring整合--><dependency><groupId>org.apache.shiro ...

  2. 【实战 Ids4】║ 在Swagger中调试认证授权中心

    回家的路上照顾好自己哟~ 大家好,老张已经顺利到家啦,闲的无事写两篇文章冒个泡吧,其实写的内容都是群友提出来的问题,简单的我会在群里直接提供思路,麻烦的我就写个文章说明一下吧,也是自己的一个记录作用, ...

  3. Spring Security中关于认证授权的配置

    以下为Spring Security在配置文件中配置系统使用内存中用户.密码.授权信息 <security:authentication-manager><security:auth ...

  4. 安全性测试之认证授权

    在web安全中,认证授权又是每个人都熟知的,就像我们都应该设置一个高强度的密码,以免被猜测破解,实际上还包括更多内容.   1. 权限 在很多系统如CRM,ERP,OA中都有权限管理,其中的目的一个是 ...

  5. 正在向icntv服务器认证授权信息,Spring-Security-OAuth2服务器之搭建认证授权服务器[一]...

    结构基础 基础框架:Spring Boot + Spring-Security-OAuth2 存储介质:Mysql + Redis 持久化方式:Spring-data-jpa 测试工具:Postman ...

  6. Shiro 认证授权详解

    1     权限管理 1.1用户身份认证 1.1.1  概念 身份认证,就是判断一个用户是否为合法用户的处理过程.最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该 ...

  7. ASP“.NET研究”.NET中的认证与授权

    用户认证 .net提供了3种用户认证的方式,分别是Windows,Forms,Passport.这几种形式的定义可以在网站根目录下Web.config中的authentication节点中看见.Win ...

  8. 开启docker中MongoDB的认证授权

    开启docker中MongoDB的认证授权 思路 开启MongoDB服务后,默认是没有权限验证的.直接通过IP加端口就可以远程访问数据库,并对数据库进行任意操作.下面介绍一下如何开启docker中Mo ...

  9. .net中的认证(authentication)与授权(authorization)

    注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧. "认证"与"授权"是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticati ...

最新文章

  1. 04_机器学习概述,什么是机器学习,应用场景,数据来源与类型,网上可用的数据集、常用数据集数据的结构组成、特征工程是什么、意义、特征抽取、sklearn特征抽取API、文本特征抽取(学习笔记)
  2. jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)
  3. 【java学习之路】(java框架)008.JdbcTemplate
  4. ios旧版本app网站_这两款app已解锁永久订阅版!
  5. 2.3创建用户访问过滤器(安全性)
  6. 多个onload事件写法
  7. c语言中变量后减号大于号,大于等于运算符.ppt
  8. 什么是代理服务器?【2022版指南】
  9. FPGA入门之一位全加器的实现
  10. 高端制造业企业信息化解决方案,工业电商平台设备、数据、体系预测性维护
  11. 分层结构的生活例子_系统抽样和分层抽样在现实生活中有什么例子?
  12. 数据库基本原理==嵌套查询
  13. adaptive chosen ciphertext attack 和 non-malleability
  14. python怎样编程_怎么自学python编程
  15. 大脑皮层由神经组织构成,大脑神经网络结构图片
  16. 2022危险化学品生产单位安全生产管理人员考试题库及模拟考试
  17. 两块STM32之间 SPI DMA通信
  18. 大连医科大学中山学院模拟医院信息系统实验室建设完成
  19. 亿级经纬度距离计算88.73秒,秒杀VBA!
  20. 微信公众号二次开发可以做哪些功能

热门文章

  1. python怎么安装包-怎么在windows下安装python第三方包
  2. opencv、matplotlib、pillow和pytorch读取数据的通道顺序
  3. grpc在java中使用
  4. LeetCode 3Sum
  5. MongoDB GridFS 存储文件
  6. mysql的varchar要根据实际长度来申请
  7. Linux下命令行(二)之文本处理基础
  8. 记本阶段建站心得,是走无限做垃圾站之路还是真正的开发之路
  9. hibernate annotations和hbm.xml配置文件在spring中的并存配置
  10. OpenCV中使用类VideoCapture加载视频和打开摄像头