- 浏览: 452366 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:383291
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
到此,前四章翻译完成,欢迎朋友提些意见! 现在你可能会意识到我们remember me功能的实现,能够在应用重启前很好的使用,但在应用重启时用户的session会被丢失。这对用户来说会不太便利,他们不应该关心JBCP Pets的维护信息。 幸运的是,Spring Security提供了将rememberme token持久化到任何存储的接口o.s.s.web.authentication.rememberme.PersistentTokenRepository,并提供了这个接口的JDBC实现。 在这里,修改remember me的配置以持久化到数据库是非常简单的。Spring Security配置的解析器能够识别出<remember-me>声明的data-source-ref新属性并为RememberMeServices切换实现类。让我们了解完成这个功能所需要的步骤。 我们需要将包含期望schema定义的SQL文件放在classpath下(WEB-INF/classes中),它会与我们在前面使用的其它启动SQL脚本放在一起。我们将这个SQL脚本命名为remember-me-schema.sql: 接下来,在dogstore-security.xml文件的<embedded-database>声明中添加对新SQL脚本的引用: 最后我们需要对<remember-me>声明做一些简单的配置修改使其指向我们使用的data source: 你可能会回忆起我们在第三章实现的TokenBasedRememberMeServices,它用MD5哈希算法将一系列与用户相关的数据编码成安全的cookie,这种方式很难(但并非不可能)篡改。o.s.s.web.authentication.rememberme.PersistentTokenBasedRememberMeServices类实现了持久化tokens以及对token安全处理,它通过一个校验方法以稍微不同的方式处理潜在的篡改。 PersistentTokenBasedRememberMeServices为每个用户创建一个唯一的序列号,用户在继续交互和认证时要使用序列号中唯一的tokens。序列号和token被存储在cookie中,在认证时要用来与存储的token进行对比。序列号和token都是基于配置的长度随机生成的,这使得恶意用户成功暴力破解的可能性很小了。 与TokenBasedRememberMeServices类似,持久化的token也可能被cookie窃取或其它的man-in-the-middle技术。在使用持久化token时,依旧建议用自定义的子类将IP地址合并到持久化token中,以及对站点的敏感区域强制使用用户名和密码认证。 在日常使用在线站点时,你很可能已经听说或使用过SSL。安全套接字层(SSL)协议,以及其后续的传输层安全(TLS),被用来为网络上的HTTP事务提供传输层的安全——它们被称为安全的HTTP事务(HTTPS)。 简而言之,SSL和TLS以一种对用户透明的方式保护原始的HTTP传输数据,这些数据在客户端浏览器和web服务器之间传输。但是作为开发人员,在设计安全站点时,规划使用SSL是很重要的。Spring Security提供了一系列的配置选项可以灵活的将SSL集成到web应用中。 【尽管SSL和TLS是不同的协议(TLS是更成熟的协议),单数大多数人更熟悉SSL这个术语,所以在本书的剩余部分,我们使用这个术语来代指SSL和TLS两个协议。】 详细介绍SSL协议的机制已经超出了本书的范围,有一些很好的书籍和技术论文很详细地介绍了其规范和协议(你可以从RFC:5246:传输安全协议(TLS)Version1.2开始,在以下地址http://tools.ietf.org/html/rfc5246) 首先且最重要的是,如果你计划执行如下SSL相关的例子,需要配置应用服务器以支持SSL连接。对于Apache Tomcat,这相对很容易。如果你在使用其它的应用服务器,请查看文档的相关部分。 我们需要使用Java的keytool命令来生成一个key store。打开一个命令提示窗口,并输入以下的命令: 按照提示进行如下的输入。输入密码password作为key store和个人密钥的密码。 【注意的是要执行的是genkeypair命令(在早于java 6的释放版本中要使用keytool的genkey命令)】 为了下一步的操作,需要记住这个文件的地址。 在Apache Tomcat的conf目录下,用XML编辑器(Eclipse或类似的都可以)打开server.xml,并取消注释或添加SSL Connector声明。应该如下所示: 取决于不同的浏览器,可能需要包含https而不是http。这样的问题可能会比较难发现,你可能会比较奇怪为什么不能看到JBCP Pets的主页。 我们假设你在对客户的数据进行SSL保护时遇到了麻烦,你想把应用的特定部分置于SSL的保护之下。幸运的是,Spring Security让这一切变得很简单,只需要在<intercept-url>声明上添加一个配置属性。 requires-channel属性能够添加到任何<intercept-url>声明中,以要求所有匹配的URL要以特定的协议(HTTP,HTTPS或都可以)进行传递。如果按照这种形式来增强JBCP Pets站点,配置可能如下所示: l 现在访问登录页和账号页需要HTTPS,浏览器将会为用户自动从不安全的(HTTP)URL重定向到安全的URL。例如,尝试访问http://localhost:8080/JBCPPets/login.do将会被定向到https://localhost:8443/JBCPPets/login.do; l 如果用户被切换到了安全的HTTPS URL,如果他访问一个不必要使用HTTPS的URL,他能继续保留在HTTPS状态。 我们可以想象这种配置对于安全的好处——大多数的现代应用服务器使用一个secure标识session的cookie,所以强制要求登录页是安全的(如果这是应用的session被首次分配的地方)能够保证session的cookie能够被安全的传输,所以出现session劫持的可能性也更小。另外,直接将SSL加密配置在安全声明上的做法,能够很容易的保证应用中所有敏感的页面被适当和完整的保护。 为用户自动切换适当协议(HTTP或HTTPS)的功能,通过Spring Security过滤器链上的另外一个servlet过滤器来实现的(它的位置很靠前,在SecurityContextPersistenceFilter后面)。如果任何URL用requires-channel属性声明使用特定类型的协议,o.s.s.web.access.channel.ChannelProcessingFilter将会自动添加到过滤器链上 ChannelProcessingFilter在请求时的交互过程如下图所示: 注意,ChannelEntryPoint使用了HTTP 302的URL重写,这就不能使用这种技术去重定向POST的URL(尽管典型的POST请求不应该在安全协议和不安全协议间传递,因为大多数的应用都会对这种行为提出警告)。 在一些特定的环境中,可能不会使用标准的HTTP和HTTPS端口,其默认为80/443或8080/8443。在这种情况下,你必须配置你的应用包含明确的端口映射,这样ChannelEntryPoint的实现能够确定当重定向用户到安全或不安全的URL时,使用什么端口。 这仅需要增加额外的配置元素<port-mappings>,它能够指明除了默认的端口以外,额外的HTTP 的HTTPS端口: 在本章中,我们: l 介绍了把安全数据存储在支持JDBC的数据库中是如何配置的; l 配置JBCP Pets使用数据库来进行用户认证以及高安全性的密码存储,这里我们使用了密码加密和salting技术; l 管理JDBC持久化到数据中的用户; l 配置用户到安全组中。组被授予角色,而不是直接对用户进行角色的指定。这提高了站点和用户功能的可管理性; l 介绍了Spring Security使用遗留的(非默认的)数据库schema; l 讲解了HTTPS技术的配置及应用,它能够提高数据在访问应用敏感内容时的安全性。 在接下来的章节中,我们将会介绍Spring Security一些高级的授权功能,并引入Spring Security的JSP标签以实现良好的授权。
将Remember me功能迁移至数据库
配置基于数据库的remember me tokens
添加SQL以创建remember me schema
create table persistent_logins (
username varchar_ignorecase(50) not null,
series varchar(64) primary key,
token varchar(64) not null,
last_used timestamp not null);
为嵌入式数据库声明添加新的SQL脚本
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:security-schema.sql"/>
<jdbc:script location="classpath:remember-me-schema.sql"/>
<jdbc:script location="classpath:test-users-groups-data.sql"/>
</jdbc:embedded-database>
配置remember me服务持久化到数据库
<http auto-config="true" use-expressions="true"
access-decision-manager-ref="affirmativeBased">
<intercept-url pattern="/login.do" access="permitAll"/>
<intercept-url pattern="/account/*.do"
access="hasRole('ROLE_USER') and fullyAuthenticated"/>
<intercept-url pattern="/*" access="hasRole('ROLE_USER')"/>
<form-login login-page="/login.do" />
<remember-me key="jbcpPetStore" token-validity-seconds="3600"
data-source-ref="dataSource"/>
<logout invalidate-session="true" logout-success-url=""
logout-url="/logout"/>
</http>
这就是我们所有要做的。现在,如果你重启应用,将不会丢失之前合法用户设置的remember me cookie。
基于数据库后台的持久化tokens是不是更安全?
用SSL保护你的站点
配置Apache Tomcat以支持SSL
生成server key store
keytool -genkeypair -alias jbcpserver -keyalg RSA -validity 365
-keystore tomcat.keystore -storetype JKS
What is your first and last name?
[Unknown]: JBCP Pets Admin
What is the name of your organizational unit?
[Unknown]: JBCP Pets
What is the name of your organization?
[Unknown]: JBCP Pets
What is the name of your City or Locality?
[Unknown]: Anywhere
What is the name of your State or Province?
[Unknown]: NH
What is the two-letter country code for this unit?
[Unknown]: US
Is CN=JBCP Pets Admin, OU=JBCP Pets, O=JBCP Pets, L=Anywhere, ST=NH, C=US
correct?
[no]: yes
这将会在当前目录下,生成一个名为tomcat.keystore的文件。这就是启用Tomcat SSL所使用的key store。
配置Tomcat的SSL Connector
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
sslProtocol="TLS"
keystoreFile="conf/tomcat.keystore"
keystorePass="password"/>
确保在上一步中生成的tomcat.keystore文件被copy到了Tomcat安装路径的conf目录下。在配置后,Tomcat服务器可以重启,JBCP Pets应用能够在一个安全的端口https://localhost:8443/JBCPPets/上进行访问。
对站点进行自动的安全保护
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.do" access="permitAll"
requires-channel="https"/>
<intercept-url pattern="/account/*.do"
access="hasRole('ROLE_USER') and fullyAuthenticated"
requires-channel="https"/>
<intercept-url pattern="/*" access="permitAll"
requires-channel="any"/>
<!-- ... -->
</http>
如果此时重启应用,你将会发现:
如果你的应用需要超出内置功能的复杂逻辑,ChannelProcessingFilter的设计可以进行扩展和增强。注意我们尽管只在图中说明了SecureChannelProcessor和RetryWithHttpsEntryPoint的实现,但是有类似的类去校验和处理声明为要求HTTP的URL。安全的端口映射
<port-mappings>
<port-mapping http="9080" https="9443"/>
</port-mappings>
如果你的应用服务器在反向代理后的话,端口映射将会更加的重要。
小结
评论
发表评论
-
《Spring In Action》第三版译序
2013-07-12 12:19 3029《Spring In Action》第三 ... -
Tomcat源码解读系列(四)——Tomcat类加载机制概述
2012-09-23 22:23 10425声明:源码版本为Tomcat 6.0.35 ... -
Tomcat源码解读系列(三)——Tomcat对HTTP请求处理的整体流程
2012-09-09 22:34 6911声明:源码版本为Tomcat 6.0.35 前面的文章 ... -
Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
2012-09-02 16:59 6338声明:源码版本为Tom ... -
Tomcat源码解读系列(一)——server.xml文件的配置
2012-08-25 07:31 6434Tomcat是JEE开发人员最常用到的开发工具,在Jav ... -
Spring Security 3全文下载
2012-03-15 20:31 20360本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6539附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5319第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7962第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4914在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6194第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8626高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12320第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6445明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7176LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6172第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2928属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5394OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7560第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2700典型ACL部署所要考虑的事情 ...
相关推荐
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...
#### 第四章:凭证安全存储 **使用数据库后台的认证** - **配置**:通过配置`UserDetailsService`接口实现与数据库交互。 - **实现细节**:使用JDBC访问数据库,获取用户信息。 **安全的密码配置** - **密码编码**...
在本文中,我们将深入探讨Spring Security 3的配置文件,以及如何理解和使用这些配置来增强应用的安全性。 首先,Spring Security的配置通常位于一个或多个XML文件中,这些文件通过`<beans>`标签定义了安全相关的...
在Spring Security 3中,你可以看到如何配置和使用Remember-Me服务,以便为用户提供更加便捷的登录体验。 7. **集成其他Spring组件**:Spring Security 可以与Spring MVC、Spring Data等其他Spring组件无缝集成。...
Spring Security 实践指南 Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户...
在Spring Security 3版本中,这个框架进一步完善了其特性和性能,使其成为开发者构建安全应用的首选工具。下面将详细探讨Spring Security 3中的关键知识点。 1. **核心组件**: - **Filter Chain**: Spring ...
在Spring Security 3.0x中,配置"remember-me"服务主要包括以下几个步骤: 1. **依赖配置**:首先,确保你的项目依赖于Spring Security 3.0.x版本。在你的pom.xml或build.gradle文件中添加相应的依赖。 2. **配置...
以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...
4. **表达式式访问控制(Expression-Based Access Control)**:Spring Security 3引入了基于SpEL(Spring Expression Language)的访问控制,允许使用表达式如`hasRole('ROLE_ADMIN')`来定义访问规则,增强了灵活性...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,专为Java应用程序设计。它在Spring生态系统中扮演着核心安全组件的角色,使得开发者能够轻松地实现安全性需求,包括用户认证、授权、会话管理...
Spring Security是Spring生态体系中的一个核心组件,主要负责应用程序的安全性,包括认证、授权和访问控制。本话题将深入探讨Spring Security的3.0.0和3.1.3两个版本,这两个版本都是该框架历史上的重要里程碑。 ...
该资源是基本Spring Security实战七篇文档中组织的源码,详情...ssecurity-rememberMe项目是Spring Security实战(七)的源码; 本人开发工具是IDEA,每个项目中的代码均可以运行并测试。Eclipse也是一样可以运行的。
源码解析可以帮助我们理解如何自定义认证提供者,以及如何与Spring Security的Remember Me服务集成,实现自动登录功能。 2. **权限控制**:基于角色的访问控制(RBAC)是Spring Security的核心部分。它允许开发人员...