本文为转载学习java
在本章中,咱们将要学习Spring Security背后的核心理念,包括重要的术语和产品架构。咱们将会关注配置Spring Security的一些方式以及对应用的做用。数据库
最重要的是为了解决工做中的问题,咱们要开始使得JBCP Pets的在线商店系统变得安全。咱们将会经过分析和理解认证如何保护在线商店的适当区域来解决在第一章:一个不安全应用的剖析中审计人员发现的第一个问题,即缺乏URL保护和统一的认证形成的权限扩散。安全
在本章的内容中,咱们将会涉及:服务器
了解应用中安全的重要概念;架构
使用Spring Security的快速配置功能,为JBCP Pets在线商店实现基本层次的安全;学习
理解Spring Security的全貌;网站
探讨认证和受权的标准配置和选项;编码
在Spring Security访问控制中使用Spring的表达式语言(Spring Expression Language)spa
因为安全审计结果的启示做用,你研究了Spring Security并肯定它可以提供一个坚实的基础,以此能够构建一个安全的系统来解决在安全审计JBCP Pet在线商店中发现的问题,而那个系统是基于Spring Web MVC开发的。
为了Spring Security的使用更高效,在开始评估和提升咱们应用的安全情况以前,先了解一些关键的概念和术语是很重要的。
认证
正如咱们在第一章所讨论的那样,认证是鉴别咱们应用中的用户是他们所声明的那我的。你可能在在线或线下的平常生活中,遇到不一样场景的认证:
凭据为基础的认证:当你登陆e-mail帐号时,你可能提供你的用户名和密码。E-mail的提供商会将你的用户名与数据中的记录进行匹配,并验证你提供的密码与对应的记录是否是匹配。这些凭证(用户名和密码,译者注)就是e-mail系统用来鉴别你是一个合法用户的。首先,咱们将首先使用这种类型的认证来保护咱们JBCP Pet在线商店的敏感区域。技术上来讲,e-mail系统可以检查凭证信息不必定非要使用数据库而是各类方式,如一个企业级的目录服务器如Microsoft Active Directory。一些这种类型的集成方式将在本书的第二部分讲解。
两要素认证:当你想从自动柜员机取钱的时候,你在被容许取钱和作其余业务前,你必须先插卡并输入你的密码。这种方式的认证与用户名和密码的认证方式很相似,与之不一样的是用户名信息被编码到卡的磁条上了。联合使用物理磁卡和用户输入密码能是银行确认你可能有使用这个帐号的权限。联合使用密码和物理设备(你的ATM卡)是一种广泛存在的两要素认证形式。专业来看,在安全领域,这种类型的设备在安全性要求高的系统中很常见,尤为是处理财务或我的识别信息时。硬件设备如RSA的SecurId联合使用了基于时间的硬件和服务端的认证软件,使得这样的环境极难被破坏。
硬件认证:早上当你启动汽车时,你插入钥匙并打火。尽管和其余的两个例子很相似,可是你的钥匙和打火装置的匹配是一种硬件认证的方式。
其实会有不少种的认证方式来解决硬件和软件的安全问题,它们各自也有其优缺点。咱们将会在本书的后面章节中介绍它们中的一些,由于它们适用于Spring Security。事实上,本书的后半部分基本上都是原来介绍不少通用的认证方式用Spring Security的实现。
Spring Security扩展了java标准概念中的已认证安全实体(对应单词principal)(java.security.Principal),它被用来惟一标识一个认证过的实体。尽管一个典型的安全实体一般一对一的指向了系统中的一个用户,但它也可能对应系统的各类客户端,如web service的客户端、自动运行的feed聚合器(automated batch feed)等等。在大多数场景下,在你使用Spring Security的过程当中,一个安全实体(Principal)只是简单地表明一个用户(user),因此我当咱们说一个安全实体的时候,你能够将其等同于说用户。
受权
受权一般涉及到两个不一样的方面,他们共同描述对安全系统的可访问性。
第一个是已经认证的安全实体与一个或多个权限(authorities)的匹配关系(一般称为角色)。例如,一个非正式的用户访问你的网站将被视为只有访问的权限而一个网站的管理员将会被分配管理的权限。
第二个是分配权限检查给系统中要进行安全保护的资源。一般这将会在系统的开发过程当中进行,有可能会经过代码进行明确的声明也可能经过参数进行设置。例如,在咱们应用中管理宠物商店详细目录的界面只能对具备管理权限的用户开放。
【要进行安全保护的资源能够是系统的任何内容,它们会根据用户的权限进行有选择的可访问控制。web应用中的受保护资源能够是单个的页面、网站的一个完整部分或者一部分界面。相反的,受保护的业务资源可能会是业务对象的一个方法调用或者单个的业务对象。】
你可能想象的出对一个安全实体的权限检查过程,查找它的用户帐号并肯定它是否是真的为一个管理员。若是权限检查肯定这个试图访问受保护区区域的安全实体其实是管理员,那么这个请求将会成功,不然,这个安全实体的请求将会由于它缺乏足够的权限而被拒绝。
咱们更近距离的看一个特定的受保护资源——产品目录的编辑界面。目录的编辑界面须要管理员才能访问(毕竟,咱们不但愿普通的用户可以调整咱们的目录层次),所以当一个安全实体访问它的时候会要求特定等级的权限。
当咱们思考一个网站的管理员试图访问受保护的资源时,权限控制决定是如何作出的时候,咱们猜测对受保护资源的权限的检查过程能够用集合理论很简明的进行表述。咱们将会使用维恩图来展示对管理用户的这个决策过程:
对这个页面来讲,在用户权限(普通用户和管理员)和须要权限(管理员)之间有一个交集,因此在交集中的用户将可以进行访问。
能够与没有受权的访问者进行对比:
权限集合没有交集,没有公共的元素。因此,用户将会被拒绝访问这个界面。至此,咱们已经介绍了对资源受权的简单原理。
实际上,会有真正的代码来决定用户是容许仍是被拒绝访问受保护的资源。下面的图片在总体上描述了这个过程,正如Spring Security所使用的那样:
咱们能够看到,有一个名为访问决策管理器(access decision manager)的组件来负责决定一个安全实体是否是有适当的访问权限,判断基于安全实体具有的权限与被请求资源所要求资源的匹配状况。
安全访问控制器对访问是否被容许的判断过程可能会很简单,就像查看安全实体所拥有的权限集合与被访问资源所要求的资源集合是否是有交集。
让咱们在JBCP Pets应用中简单使用Spring Security,并将会更详细的阐述认证和受权。