- 浏览: 306056 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
Remember me
对于经常访问站点的用户有一个便利的功能就是 remember me 。这个功能允许一个再次访问的用户能够被记住,它通过在用户的浏览器上存储一个加密的 cookie 来实现的。如果 Spring Security 能够识别出用户提供的 remember me cookie ,用户将不必填写用户名和密码,而是直接登录进入系统。
与到目前为止我们介绍的其它功能不同, remember me 功能并不是在使用 security 命名空间方式的配置中自动添加的。让我们尝试这个功能并查看它是怎样影响登录流程的。
实现 remember me 选项
完成这个练习后,将会为用户访问 pet store 应用提供一个简单的记忆功能。
修改 dogstore-security.xml 配置文件,添加 <remember-me> 声明。设置 key 属性为 jbcpPetStore :
- < http auto-config = "true" use-expressions = "true" access-decision-
- manager-ref = "affirmativeBased" >
- …
- < remember-me key = "jbcpPetStore" />
- < logout invalidate-session = "true" logout-success-url = "/" logout-url = "/logout" />
- </ http >
如果我们现在尝试使用应用,在流程上将不会看到有任何的变化。这是因为还需要在登录 form 上添加一个输入域,以允许用户选择使用这个功能。编辑 login.jsp 文件,添加一个 checkbox ,代码如下:
- < input id = "j_username" name = "j_username" size = "20" maxlength = "50" type = "text" />
- < br />
- < input id = "_spring_security_remember_me" name ="_spring_security_
- remember_me" type = "checkbox" value = "true" />
- < label for = "_spring_security_remember_me" > Remember Me? </ label >
- < br />
- < label for = "j_password" > Password </ label > :
当我们再次登录时,如果 Remember Me 被选中,一个 Remember Me 的 cookie 将会设置在用户的浏览器中。
如果用户关闭浏览器并重新打开访问一个 JBCP Pets 站点上需要认证的页面,他将不会再看到登录页了。请亲自试一下——登录并将 Remember Me 选项选中,收藏首页,然后重启浏览器并再次访问首页。你能发现你直接登录成功并不再需要提供凭证。
一些高级的用户在体验本功能时也可以使用浏览器插件如 Firecookie ( http://www.
softwareishard.com/blog/firecookie/ ),来管理(移除)会话 session 。这将会在你开发或校验这种类型功能时,节省你时间和提高效率。
Remember me 是怎样实现的
Remember me 功能设置了一个 cookie 在用户的浏览器上,它包含一个 Base64 编码的字符串,包含以下内容:
l 用户的名字;
l 过期的日期 / 时间;
l 一个 MD5 的散列值包括过期日期 / 时间、用户名和密码;
l 应用的 key 值,是在 <remember-me> 元素的 key 属性中定义的。
这些内容将被组合成一个 cookie 的值存储在浏览器中以备后用。
MD5 是一种知名的加密哈希算法。加密哈希算法将输入的数据进行压缩并生成唯一的任意长度的文字,这叫做摘要。摘要能够在以后使用,以校验不明的输入是否与生成 hash 的输入内容完全一致,此时并不需要使用原来的输入内容本身。下面的图片展示了这个过程:
你可以看到,未知的输入可以与存储的 MD5 哈希进行校验,并能够得出未知的输入与存储的已知输入是否匹配的结论。摘要和加密算法( encryption algorithms )的一个重要不同在于,它很难从反向工程从摘要值得到初始的数据。这是因为摘要仅仅是原始内容的一个概述或指纹( fingerprint, ),并不是全部的数据本身(它可能会很大)。
尽管对加密的数据不可能进行解码,但是 MD5 对一个类型的国际却很脆弱,包括挖掘算法本身的弱点以及彩虹表攻击( rainbow table attacks )。彩虹表通常会包括数百万输入值计算出来的哈希值。这使得攻击者能够寻找彩虹表中的哈希值从而确定实际值(未经过 hash 的值)。我们将会在第四章:凭证安全存储 中讲解密码安全的时,介绍防范这种攻击的一种方法。
关于 remember me 的 cookie ,我们能够看到这个 cookie 的组成足够复杂,所以对攻击者来说很难造出一个仿冒的 cookie 。在第四章中,我们将会学习另一种技术来使得 remember me 功能更加安全,免受恶意攻击。
Cookie 的失效时间基于一个配置的过期时间段的长度。如果用户在 cookie 失效之前重新访问我们的站点,这个 cookie 将和应用设置的其它 cookie 一起提交到应用上。
如果存在 remember me cookie , o.s.s.web.authentication.rememberme.RememberMeAuthenticationFilter 过滤器将会检查 cookie 的内容并通过检查是否为一个认证过的 remember me cookie 来认证用户(查看本章后面的 Remember me 是否安全? 章节,将会讲述这样做的原因),这个过滤器是通过 <remember-me> 配置指令添加到过滤器链中的。
下面的图表阐述了校验 remember me cookie 过程中涉及到的不同组件:
RememberMeAuthenticationFilter 在过滤器链中,位于 SecurityContextHolderAwareRequestFilter 之后,而在 AnonymousProcessingFilter 之前。正如链中的其它过滤器那样, RememberMeAuthenticationFilter 也会检查 request ,如果是其关注的,对应的操作将会被执行。
按图中所述,过滤器负责检查用户的过滤器是否 remember me cookie 作为它们请求的一部分。如果 remember me 被发现,它会是一个 Base64 的编码,期望的 MD5 哈希值通过 cookie 中的用户名和密码进行计算获得。(这里感觉有些问题,因为期望的 MD5 值应该是通过应用来进行获取,而不是提供前台过来的 cookie 计算出来的。?)如果 cookie 通过这一层的校验,用户就已经登录成功了。
【你可能已经意识到如果用户修改了用户名或密码,任何的 remember me token 都将失效。请确保给用户提供适当的信息,如果允许它们修改账号的那些信息。在第四章中,我们将会看到一个替代的 remember me 实现,它只依赖用户名并不依赖密码。】
我们看到 RememberMeAuthenticationFilter 依赖一个 o.s.s.web.authentication.RememberMeServices 的实现来校验 cookie 。如果登录请求的 request 包含一个名为 _spring_security_remember_me 的 form 参数,相同的实现类也会于 form 登录成功时使用。这个 cookie 用上面提到的信息进行编码,以 Base64 编码存储在浏览器中,包含了时间戳和用户密码等信息形成的 MD5 哈希值。
需要记住的是,可以区分通过 remember me 认证的用户和提供用户名和密码(或相当凭证)认证的用户。我们将会在审查 remember me 功能的安全性的时,对其进行简单的实验。
Remember me 与用户的生命周期
RememberMeServices 的实现在用户的生命周期中(一个认证用户 session 的生命周期)在好几个地方被调用。为了使你理解 remember me 功能,了解 remember me service 完成生命周期功能的时间点将会有所帮助:
行为 |
应该做什么? |
登录成功 |
实现类设置 remember me cookie (如果设置了对应的 form 参数) |
登录失败 |
如果存在的话,实现类应该删掉这个 cookie |
用户退出 |
如果存在的话,实现类应该删掉这个 cookie |
知道 RememberMeServices 在何时以及怎样与用户的生命周期关联对于创建自定义的认证处理至关重要,因为我们需要保证任何的自定义认证处理对待 RememberMeServices 保持一致性,以保证这个功能的有效性和安全性。
Remember me 配置指令
可以修改两个常用的配置来改变 remember me 功能的默认行为:
属性 |
描述 |
Key |
为 remember mecookie 定义一个唯一的 key 值,以与我们的应用关联 |
token-validity-seconds |
定义时间的长度(以秒计)。 Remember me 的 cookie 将在将被视为认证合法,并且也将用于设置 cookie 的过期时间。 |
通过对 cookie 哈希内容生成的讲解你可以推断出, Key 属性对与 remember me 功能的安全性很重要。要保证你选择的 key 值是你的应用唯一使用的,并且足够长以至于不能很容易的被猜出。
请记住本书的目的何在,我们让 key 的值相对很简单,但是如果你要使用 remember me 功能在你的应用中,建议 key 值包含应用的唯一名称以及至少 36 位长度的随机字符。密码生成工具(在 google 中搜索“ online password generator ”)是一个好办法来得到包含文字数字以及特殊字符组成的伪随机混合内容,以作为你的 remember me key 值。
还要记住的是应用处于不同的环境中(如开发、测试、产品级等), remember me cookie 的值也要考虑这些情况。这能够避免 remember me cookie 在测试阶段被无意中的错误使用。
一个产品环境的应用中,示例的 key 值如下:
jbcpPets-rmkey-paLLwApsifs24THosE62scabWow78PEaCh99Jus
token-validity-seconds 属性被用来设置 remember me token 被接受作为自动登录功能(即使要校验的 token 不合法)的秒数。本属性还会设置用户浏览器中登录 cookie 能够被保存的最长时间。
【设置 remember me 的会话 cookie :如果 token-validity-seconds 属性被设置成 -1 ,登录 cookie 将被设置为会话 cookie ,即在用户关闭浏览器后不会被保存。 Token 的有效时间是一个不可配置的值为 2 周(假设用户不关闭浏览器)。不要将这个 cookie 与存储用户的 session ID 的 cookie 相混淆——它们是不同的事情却有着类似的名字。】
关于 remember me 功能的高级自定义功能,还有几个其它的配置指令。我们将会在接下来的练习中包含部分,另一部分在第六章:高级配置与扩展 中包含,那时会介绍高级的授权技术。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 10642、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 958最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2676作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1069一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3461不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1749笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1346认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1057Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 1030手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1248理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4232Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1525实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1128第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 1061方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 894保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1030使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 977实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 952第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1270将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1815你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...
该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:深入理解Spring Security3 本章深入...
- **Remember-Me 认证**:支持“记住我”功能,以便用户无需每次都输入凭证即可访问受保护的资源。 - **添加 HTTP/HTTPS 信道安全**:通过 `<https>` 元素来配置 HTTPS 支持,确保数据传输的安全性。 - **会话管理**...
- Spring Security 可以与OAuth2框架集成,提供第三方服务的认证和授权,支持资源服务器、认证服务器和客户端的角色。 8. **Spring Security ACL**: - 对象级权限管理(ACL)允许开发者对应用内的具体对象实施细...
"Spring Security 构建 REST 服务实现 RememberMe 记住我功能" Spring Security 是一个功能强大且灵活的安全框架,广泛应用于 Java Web 应用程序中。在本文中,我们将介绍如何使用 Spring Security 构建 REST 服务...
- 配置和使用RememberMe服务以实现自动登录功能。 - 实现CSRF防护,理解CSRFTokenRepository的工作原理。 - 学习如何集成Spring Security与OAuth2,为API提供授权服务。 - 了解如何使用JWT进行状态管理,包括生成和...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
#### 第三章:增强用户体验 **自定义登录页面** - 通过自定义登录页面提高用户体验,可以更好地融入网站的设计风格。 **实现Remember-Me功能** - **原理**:记住用户的登录状态,下次访问时自动登录。 - **实现**...
- OAuth 2.0 是一个开放标准,用于授权第三方应用访问用户资源。Spring Security 支持 OAuth 2.0,可以帮助开发者构建安全的授权服务器和资源服务器。 通过这个教程,你将了解 Spring Security 的核心概念,并能...
Spring Security 是一个强大的和高度可定制的身份验证和...总的来说,Spring Security 3.x第五章的实例将帮助开发者深入理解这个框架的使用,通过具体的代码示例来实践安全性配置,从而更好地保护他们的Spring应用。
根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...
7. **OAuth2支持**:SpringSecurity还支持OAuth2协议,提供了一种安全的第三方应用访问资源的方式。 8. **Remember-Me服务**:允许用户在一段时间内无须再次输入登录凭据,提高用户体验。 9. **自定义扩展**:...
#### 第三章:增强用户体验 - **自定义登录页**: - **实现自定义的登录页**:提供具体实现步骤。 - **理解退出功能**: - **在站点页头上添加“LogOut”链接**:说明如何在网站中添加退出链接。 - **退出是怎么...
- Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...
标题:springsecurity3.1.pdf 描述:springsecurity3.1.pdf 标签:spring security3.1 部分内容:SpringSecurity Reference Documentation by Ben Alex and Luke Taylor 3.1.4.RELEASE **一、Spring Security 3.1...
Spring Security则是在Spring框架基础上构建的安全管理组件,为应用程序提供了全面的身份验证、授权和访问控制功能。 Spring框架的主要组成部分包括: 1. **IoC容器**:是Spring的核心,负责管理对象的生命周期和...
Spring Security支持OAuth2协议,允许第三方应用通过授权获取用户资源。这对于构建API或微服务环境中的身份验证和授权非常有用。 9. **配置**: Spring Security的配置可以通过XML、Java配置或者使用`@...
9. **OAuth2集成**:SpringSecurity可以与OAuth2协议结合,实现身份验证和授权的开放标准,便于构建API和第三方应用集成。 10. **Web安全配置**:SpringSecurity提供了基于Java或XML的配置方式,可以精细控制Web...
Spring Security提供了OAuth2客户端和服务端的实现,手册将详细阐述如何配置和使用这些功能。 此外,Spring Security还提供了对Remember-Me服务的支持,允许用户在一段时间内无需再次登录。手册将指导读者如何设置...