- 浏览: 292843 次
- 性别:
- 来自: 唐山
最新评论
-
小灯笼:
JBPM5.4实战流程引擎开发网盘地址:https://pan ...
跟我学工作流——jBPM4视频教程(免费) -
Kai_Ge:
学会做人 写道临远大哥,谢谢你的贡献大名鼎鼎的临远!!膜拜中。 ...
Spring Security-3.0.1中文官方文档(翻译版) -
漂泊一剑客:
博主,你自己电脑上有下载,这些信息吗,能否分享一下给我
跟我学工作流——jBPM4视频教程(免费) -
Rookie_Li:
您好,您的教程很有用,请问例子的源码在哪下载?
spring security权限管理手册升级至spring security-3.1.3 -
nullFFF:
马教授 写道现在还用4有点过时了,最新的都已经是5.4了,目前 ...
跟我学工作流——jBPM4视频教程(免费)
Remember-Me认证
14.1. 概述
记住我(remember-me)或持久登录(persistent-login)认证,指的是网站可以在不同会话之间记忆验证的身份。 通常情况是发送一个cookie给浏览器,在以后的session里检测cookie,进行自动登录。 Spring Security为remember-me实现提供了必要的调用钩子,并提供了两个remember-me的具体实现。 其中一个使用散列来保护基于cookie标记的安全性,另一个使用了数据库或其他持久化存储机制来保存生成的标记。
注意,两个实现方式,都需要UserDetailsService。 如果你使用了认证提供器,没有使用UserDetailsService(比如LDAP供应器),那它就没法工作,除非你在application context里设置了一个UserDetailsService。
14.2. 简单基于散列标记的方法
这种方法使用散列来完成remember-me策略。 本质上,在成功进行认证的之后,把一个cookie发送给浏览器,使用的cookie组成结构如下:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
username: As identifiable to the UserDetailsService
password: That matches the one in the retrieved UserDetails
expirationTime: The date and time when the remember-me token expires, expressed in milliseconds
key: A private key to prevent modification of the remember-me token
这个remember-me标记只适用于指定范围,提供用户名,密码和关键字都不会改变。 值得注意,这里有一个潜在的安全问题,来自任何一个用户代理的remember-me标记,直到标记过期都是可用的。 这个问题和摘要式认证相同。 如果一个用户发现标记已经设置了,他们可以轻易修改他们的密码,并且立即注销所有的remember-me标记。 如果需要更好的安全性,你应该使用下一章描述的方法。 或者不应该使用remember-me服务。
如果你还记得在命名空间配置中讨论的主题,你只要添加<remember-me>元素就可以使用remember-me认证:
<http>
...
<remember-me key="myAppKey"/>
</http>
如果你使用了auto-config设,它也会自动启用。 这个UserDetailsService会自动选上。 如果你在application context中配置了多个,你需要使用user-service-ref属性指定应该使用哪一个,这里的值要放上你的UserDetailsService bean的名字。
14.3. 持久化标记方法
这个方法是基于这篇文章 http://jaspan.com/improved_persistent_login_cookie_best_practice 进行了一些小修改 [3]。 要用在命名空间配置里使用这个方法,你应该提供一个datasource引用:
<http>
...
<remember-me data-source-ref="someDataSource"/>
</http>
数据应该包含一个 persistent_logins 表,可以使用下面的SQl创建(或等价物):
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
14.4. Remember-Me接口和实现
Remember-me认证不能和基本认证一起使用,因为基本认证往往不使用HttpSession。 Remember-me使用在AuthenticationProcessingFilter中,通过在它的超类AbstractProcessingFilter里实现的一个调用钩子。 这个钩子会在合适的时候调用一个具体的RememberMeServices。 这个接口看起来像这样:
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
void loginFail(HttpServletRequest request, HttpServletResponse response);
void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication);
请参考JavaDocs获得有关这些方法的完整讨论,不过注意在这里,AbstractProcessingFilter只调用loginFail() 和 loginSuccess()方法。 当SecurityContextHolder没有包含Authentication的时候,RememberMeProcessingFilter才去调用autoLogin()。 因此,这个接口通过使用完整的认证相关事件的提醒提供了下面remember-me实现,然后在可能包含一个cookie希望被记得的申请web请求中调用这个实现。 这个设计允许任何数目的remember-me实现策略。 我们在下面看看上面介绍过的两个Spring Security提供的实现。
14.4.1. TokenBasedRememberMeServices
这个实现支持在Section 14.2, “简单基于散列标记的方法”里描述的简单方法。 TokenBasedRememberMeServices被 RememberMeAuthenticationProvider执行的时候生成一个RememberMeAuthenticationToken。 认证提供器和TokenBasedRememberMeServices之间共享一个key。 另外TokenBasedRememberMeServices需要一个UserDetailsService,用它来获得用户名和密码,进行比较,然后生成RememberMeAuthenticationToken来包含正确的GrantedAuthority[]。 如果用户请求注销,让cookie失效,就应该使用系统提供的一系列注销命令。 TokenBasedRememberMeServices也实现Spring Security的LogoutHandler接口,这样可以使用LogoutFilter自动清除cookie。
这些bean要求在application context里启用remember-me服务,像下面一样:
<bean id="rememberMeProcessingFilter"
class="org.springframework.security.ui.rememberme.RememberMeProcessingFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>
<bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>
<bean id="rememberMeAuthenticationProvider"
class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>
不要忘记把你的RememberMeServices实现添加到AuthenticationProcessingFilter.setRememberMeServices()属性中,包括把RememberMeAuthenticationProvider添加到你的AuthenticationManager.setProviders()队列中,把RememberMeProcessingFilter添加到你的FilterChainProxy中(要放到AuthenticationProcessingFilter后面)。
14.4.2. PersistentTokenBasedRememberMeServices
这个类可以像TokenBasedRememberMeServices一样使用,但是它还需要配置一个PersistentTokenRepository来保存标记。 这里有两个标准实现。
*
InMemoryTokenRepositoryImpl最好是只用来测试。
*
JdbcTokenRepositoryImpl把标记保存到数据库里。
数据库表结构在 Section 14.3, “持久化标记方法”.
[3] 基本上,为了防止暴露有效登录名,用户名没有包含在cookie里。在这个文章的评论里有一个相关的讨论。
14.1. 概述
记住我(remember-me)或持久登录(persistent-login)认证,指的是网站可以在不同会话之间记忆验证的身份。 通常情况是发送一个cookie给浏览器,在以后的session里检测cookie,进行自动登录。 Spring Security为remember-me实现提供了必要的调用钩子,并提供了两个remember-me的具体实现。 其中一个使用散列来保护基于cookie标记的安全性,另一个使用了数据库或其他持久化存储机制来保存生成的标记。
注意,两个实现方式,都需要UserDetailsService。 如果你使用了认证提供器,没有使用UserDetailsService(比如LDAP供应器),那它就没法工作,除非你在application context里设置了一个UserDetailsService。
14.2. 简单基于散列标记的方法
这种方法使用散列来完成remember-me策略。 本质上,在成功进行认证的之后,把一个cookie发送给浏览器,使用的cookie组成结构如下:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
username: As identifiable to the UserDetailsService
password: That matches the one in the retrieved UserDetails
expirationTime: The date and time when the remember-me token expires, expressed in milliseconds
key: A private key to prevent modification of the remember-me token
这个remember-me标记只适用于指定范围,提供用户名,密码和关键字都不会改变。 值得注意,这里有一个潜在的安全问题,来自任何一个用户代理的remember-me标记,直到标记过期都是可用的。 这个问题和摘要式认证相同。 如果一个用户发现标记已经设置了,他们可以轻易修改他们的密码,并且立即注销所有的remember-me标记。 如果需要更好的安全性,你应该使用下一章描述的方法。 或者不应该使用remember-me服务。
如果你还记得在命名空间配置中讨论的主题,你只要添加<remember-me>元素就可以使用remember-me认证:
<http>
...
<remember-me key="myAppKey"/>
</http>
如果你使用了auto-config设,它也会自动启用。 这个UserDetailsService会自动选上。 如果你在application context中配置了多个,你需要使用user-service-ref属性指定应该使用哪一个,这里的值要放上你的UserDetailsService bean的名字。
14.3. 持久化标记方法
这个方法是基于这篇文章 http://jaspan.com/improved_persistent_login_cookie_best_practice 进行了一些小修改 [3]。 要用在命名空间配置里使用这个方法,你应该提供一个datasource引用:
<http>
...
<remember-me data-source-ref="someDataSource"/>
</http>
数据应该包含一个 persistent_logins 表,可以使用下面的SQl创建(或等价物):
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
14.4. Remember-Me接口和实现
Remember-me认证不能和基本认证一起使用,因为基本认证往往不使用HttpSession。 Remember-me使用在AuthenticationProcessingFilter中,通过在它的超类AbstractProcessingFilter里实现的一个调用钩子。 这个钩子会在合适的时候调用一个具体的RememberMeServices。 这个接口看起来像这样:
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
void loginFail(HttpServletRequest request, HttpServletResponse response);
void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication);
请参考JavaDocs获得有关这些方法的完整讨论,不过注意在这里,AbstractProcessingFilter只调用loginFail() 和 loginSuccess()方法。 当SecurityContextHolder没有包含Authentication的时候,RememberMeProcessingFilter才去调用autoLogin()。 因此,这个接口通过使用完整的认证相关事件的提醒提供了下面remember-me实现,然后在可能包含一个cookie希望被记得的申请web请求中调用这个实现。 这个设计允许任何数目的remember-me实现策略。 我们在下面看看上面介绍过的两个Spring Security提供的实现。
14.4.1. TokenBasedRememberMeServices
这个实现支持在Section 14.2, “简单基于散列标记的方法”里描述的简单方法。 TokenBasedRememberMeServices被 RememberMeAuthenticationProvider执行的时候生成一个RememberMeAuthenticationToken。 认证提供器和TokenBasedRememberMeServices之间共享一个key。 另外TokenBasedRememberMeServices需要一个UserDetailsService,用它来获得用户名和密码,进行比较,然后生成RememberMeAuthenticationToken来包含正确的GrantedAuthority[]。 如果用户请求注销,让cookie失效,就应该使用系统提供的一系列注销命令。 TokenBasedRememberMeServices也实现Spring Security的LogoutHandler接口,这样可以使用LogoutFilter自动清除cookie。
这些bean要求在application context里启用remember-me服务,像下面一样:
<bean id="rememberMeProcessingFilter"
class="org.springframework.security.ui.rememberme.RememberMeProcessingFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>
<bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>
<bean id="rememberMeAuthenticationProvider"
class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>
不要忘记把你的RememberMeServices实现添加到AuthenticationProcessingFilter.setRememberMeServices()属性中,包括把RememberMeAuthenticationProvider添加到你的AuthenticationManager.setProviders()队列中,把RememberMeProcessingFilter添加到你的FilterChainProxy中(要放到AuthenticationProcessingFilter后面)。
14.4.2. PersistentTokenBasedRememberMeServices
这个类可以像TokenBasedRememberMeServices一样使用,但是它还需要配置一个PersistentTokenRepository来保存标记。 这里有两个标准实现。
*
InMemoryTokenRepositoryImpl最好是只用来测试。
*
JdbcTokenRepositoryImpl把标记保存到数据库里。
数据库表结构在 Section 14.3, “持久化标记方法”.
[3] 基本上,为了防止暴露有效登录名,用户名没有包含在cookie里。在这个文章的评论里有一个相关的讨论。
发表评论
-
spring security权限管理手册升级至spring security-3.1.3
2012-12-08 01:01 12296费了半天劲,终于把原来基于spring security 2. ... -
请把acegi替换成Spring Security(内附视频)
2010-03-22 09:54 6562在对web项目进行权限管理时,采用的方法无非是写一大堆JSP或 ... -
Spring Security-3.0.1中文官方文档(翻译版)
2010-01-19 09:36 10644这次发布的Spring Security-3.0.1是一个bu ... -
敬献Spring Security-3.x官方文档中文版
2009-12-29 11:43 10879Spring Security-3.x新近发布,整体的项 ... -
【分享】《基于Spring Security的ACL实现与扩展》内附ppt下载
2009-09-21 09:43 3451上次朋友间技术交流整理的ppt文档,因为之前一直在整理Spri ... -
Spring Security 安全权限管理手册(0.1.0更新)
2009-08-05 10:26 5034随着内容的堆叠,文档结构开始渐渐混乱了,到0.1.0为止关于认 ... -
Spring Security 安全权限管理手册(0.0.9更新)
2009-07-27 09:27 3278这次更新中包含了一个在用户输入密码错误三次后锁定账户的示 ... -
Spring Security 安全权限管理手册(0.0.8更新)
2009-07-20 09:58 1890Spring Security-2.0.5发布,这个bug ... -
Spring Security 安全权限管理手册(0.0.7更新)
2009-07-13 00:38 3196这一次迭代,对章节的命名进行了这里,目标是尽快覆盖Spring ... -
Spring Security 安全权限管理手册(0.0.6更新)
2009-07-10 01:54 1669这一次,我们添加了taglib标签库的时候,以及如何使用多种方 ... -
Spring Security手册更新cas, basic, acl
2009-06-29 18:13 2670这次更新的都是重头戏,CAS和ACL。其中ACL只是简述了Sp ... -
Spring Security手册更新——添加“管理会话”和对namespace,database
2009-06-22 10:04 1942新增的部分有,第八章“管理会话”,附录D,E分别整 ... -
图解Spring Security默认使用的过滤器
2009-06-15 10:38 3860第 9 章 图解过滤器 图 9.1. au ... -
Spring Security-2.0导航-基础篇,又添两章
2009-06-10 10:31 1916目前我们在基础篇中已经编写了六章,基本上可 ... -
Spring Security-2.0入门教程(基础篇)
2009-06-04 17:48 4775欢迎阅读咱们写的Spring Security教程,咱们既不想 ... -
springsecurity-2.x官方文档中文翻译初步整理完成,附上几个例子
2008-08-17 11:12 7891预览地址:http://family168.com/tutor ... -
(翻译)Spring Security-2.0.x参考文档“领域对象安全”
2008-08-13 00:18 2199领域对象安全 24.1. 概述 请注意:在2.0.0之前,S ... -
(翻译)Spring Security-2.0.x参考文档“安全对象实现”
2008-08-12 09:50 2027安全对象实现 23.1. AOP联盟 (MethodInvoc ... -
(翻译)Spring Security-2.0.x参考文档“通用授权概念”
2008-08-11 18:22 2820通用授权概念 22.1. 授权 在认证部分简略提过了,所有的 ... -
(翻译)Spring Security-2.0.x参考文档“安全数据库表结构”
2008-08-10 09:52 2035安全数据库表结构 可以为框架采用不同的数据库结构,这个附录为 ...
相关推荐
包含翻译后的API文档:spring-security-core-5.3.9.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.3.9.RELEASE; 标签:springframework、security...
spring-beans-2.0.xsd
包含翻译后的API文档:spring-security-core-5.2.0.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.2.0.RELEASE; 标签:springframework、security...
包含翻译后的API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security.oauth:spring-security-oauth2:2.3.5.RELEASE; 标签:spring、security...
包含翻译后的API文档:spring-security-rsa-1.0.10.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-rsa:1.0.10.RELEASE; 标签:spring、rsa、security、...
包含翻译后的API文档:spring-security-jwt-1.0.10.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-jwt:1.0.10.RELEASE; 标签:spring、security、jwt、...
包含翻译后的API文档:spring-security-web-5.2.0.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-web:5.2.0.RELEASE; 标签:springframework、security、...
spring-boot-starter-web-2.0.7.0.jar
spring-dwr-2.0.xsd spring 与 DWR进行配置
包含翻译后的API文档:spring-boot-actuator-autoconfigure-2.3.12.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.boot:spring-boot-actuator-autoconfigure:2.3.12....
Struts2-Spring-Plugin-2.0.11.1版本是在2.0.11.1时期发布的,可能包含了一些特定的修复和优化,具体可以查阅该版本的发行说明或官方文档,以了解其特性、改进和已知问题。 在使用这个插件时,你需要在Struts2的...
包含翻译后的API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.security.oauth:spring-security-oauth2:2.3.5.RELEASE; 标签:spring...
包含翻译后的API文档:spring-security-core-5.0.7.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.0.7.RELEASE; 标签:springframework、security...
spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-2.5.2.jar spring-aop-2.5.4.jar spring-aop-2.5.5.jar spring-aop-2.5.6.jar spring-aop-3.0.0.RELEASE.jar spring-aop-3.0.2.RELEASE.jar spring-aop-sources...
包含翻译后的API文档:spring-security-crypto-5.6.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-crypto:5.6.1; 标签:spring、security、springframework、...
在这个场景中,`commons-fileupload-1.2.1.jar` 和 `commons-io-2.0.jar` 是两个至关重要的库,它们为Spring提供了强大的文件上传支持。 `commons-fileupload-1.2.1.jar` 是Apache Commons FileUpload项目的组件,...
包含翻译后的API文档:spring-security-jwt-1.0.10.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.security:spring-security-jwt:1.0.10.RELEASE; 标签:spring、security...
首先,`struts-2.0.dtd`是Struts 2.0的文档类型定义,它是XML文件的一种规范,用于验证`struts.xml`配置文件的语法是否正确。DTD中定义了配置元素和属性,如action、result、package等,确保开发者在编写配置文件时...
包含翻译后的API文档:spring-security-crypto-5.5.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-crypto:5.5.2; 标签:springframework、security、spring、...