`
lengyun3566
  • 浏览: 453519 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:384128
社区版块
存档分类
最新评论

《Spring Security3》第三章第三部分翻译上(Remember me功能实现)

阅读更多

 

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 Mecookie将会设置在用户的浏览器中。

如果用户关闭浏览器并重新打开访问一个JBCP Pets站点上需要认证的页面,他将不会再看到登录页了。请亲自试一下——登录并将Remember Me选项选中,收藏首页,然后重启浏览器并再次访问首页。你能发现你直接登录成功并不再需要提供凭证。

 

一些高级的用户在体验本功能时也可以使用浏览器插件如Firecookiehttp://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 mecookie,我们能够看到这个cookie的组成足够复杂,所以对攻击者来说很难造出一个仿冒的cookie。在第四章中,我们将会学习另一种技术来使得remember me功能更加安全,免受恶意攻击。

 

Cookie的失效时间基于一个配置的过期时间段的长度。如果用户在cookie失效之前重新访问我们的站点,这个cookie将和应用设置的其它cookie一起提交到应用上。

 

如果存在remember me cookieo.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 mecookie将在将被视为认证合法,并且也将用于设置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 IDcookie相混淆——它们是不同的事情却有着类似的名字。】

 

关于remember me功能的高级自定义功能,还有几个其它的配置指令。我们将会在接下来的练习中包含部分,另一部分在第六章:高级配置与扩展中包含,那时会介绍高级的授权技术。

  • 大小: 35.2 KB
  • 大小: 49.7 KB
11
3
分享到:
评论
9 楼 beyond_开阔天空 2014-10-15  
请问一下,后台的验证是怎么知道cookie中的用户可以规定的时间内自动登录
8 楼 375780950 2014-04-29  
水电费水电费
7 楼 tw_wangzhengquan 2014-01-27  
看不懂是自己能力的问题,我照着做了,代码都能正确的跑起来。
6 楼 suene 2013-03-07  
  
5 楼 jobar 2013-02-22  
引用
(这里感觉有些问题,因为期望的MD5值应该是通过应用来进行获取,而不是提供前台过来的cookie计算出来的。?)

这里的MD5确实是通过前台传过来的cookie计算出来的,看这个方法:
String org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.makeTokenSignature(long tokenExpiryTime, String username, String password)

    /**
     * Calculates the digital signature to be put in the cookie. Default value is
     * MD5 ("username:tokenExpiryTime:password:key")
     */
    protected String makeTokenSignature(long tokenExpiryTime, String username, String password) {
        String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey();
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException("No MD5 algorithm available!");
        }

        return new String(Hex.encode(digest.digest(data.getBytes())));
    }
4 楼 salever 2012-09-21  
翻译是很耗时耗精力而且不讨好的,我曾经翻译过一个简单的User Guide,没想到上来一个人评论的就很尖锐,后来我也就释然了,翻译或者写作都当成是自我提高的一种表现吧。而且还有一个很重要的原因,现在的人一般都是对别人要求严格对自己要求却很低,哈哈 
3 楼 shizhijie737 2011-10-27  
我以一个java开发者的角度来说,你翻译的绝对没问题,技术文档还得做技术的人翻译才行啊,加油
2 楼 lengyun3566 2011-07-05  
stevensinclair 写道
踩的人是看不懂还是怎么了呢?

呵呵,没事的
昨天和一个翻译过不少书的朋友交流了一下,确实有些地方翻译的还不好
等我把前三章翻译完,再好好检查一遍
1 楼 stevensinclair 2011-07-05  
踩的人是看不懂还是怎么了呢?

相关推荐

    《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件

    《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...

    Spring Security3中文文档

    该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:深入理解Spring Security3 本章深入...

    spring security3 中文版本

    - **Remember-Me 认证**:支持“记住我”功能,以便用户无需每次都输入凭证即可访问受保护的资源。 - **添加 HTTP/HTTPS 信道安全**:通过 `&lt;https&gt;` 元素来配置 HTTPS 支持,确保数据传输的安全性。 - **会话管理**...

    Spring Security 资料合集

    - Spring Security 可以与OAuth2框架集成,提供第三方服务的认证和授权,支持资源服务器、认证服务器和客户端的角色。 8. **Spring Security ACL**: - 对象级权限管理(ACL)允许开发者对应用内的具体对象实施细...

    Spring Security 构建rest服务实现rememberme 记住我功能

    "Spring Security 构建 REST 服务实现 RememberMe 记住我功能" Spring Security 是一个功能强大且灵活的安全框架,广泛应用于 Java Web 应用程序中。在本文中,我们将介绍如何使用 Spring Security 构建 REST 服务...

    springsecurity学习笔记

    - 配置和使用RememberMe服务以实现自动登录功能。 - 实现CSRF防护,理解CSRFTokenRepository的工作原理。 - 学习如何集成Spring Security与OAuth2,为API提供授权服务。 - 了解如何使用JWT进行状态管理,包括生成和...

    springSecurity3例子

    - Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...

    Spring Security3

    #### 第三章:增强用户体验 **自定义登录页面** - 通过自定义登录页面提高用户体验,可以更好地融入网站的设计风格。 **实现Remember-Me功能** - **原理**:记住用户的登录状态,下次访问时自动登录。 - **实现**...

    Spring Security 教程(Spring Security Tutorial)1

    - OAuth 2.0 是一个开放标准,用于授权第三方应用访问用户资源。Spring Security 支持 OAuth 2.0,可以帮助开发者构建安全的授权服务器和资源服务器。 通过这个教程,你将了解 Spring Security 的核心概念,并能...

    spring security 3.x第五章例子

    Spring Security 是一个强大的和高度可定制的身份验证和...总的来说,Spring Security 3.x第五章的实例将帮助开发者深入理解这个框架的使用,通过具体的代码示例来实践安全性配置,从而更好地保护他们的Spring应用。

    Spring Security3 中文版 张卫滨 推荐

    根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...

    SpringSecurity源码

    7. **OAuth2支持**:SpringSecurity还支持OAuth2协议,提供了一种安全的第三方应用访问资源的方式。 8. **Remember-Me服务**:允许用户在一段时间内无须再次输入登录凭据,提高用户体验。 9. **自定义扩展**:...

    spring security3中文文档

    #### 第三章:增强用户体验 - **自定义登录页**: - **实现自定义的登录页**:提供具体实现步骤。 - **理解退出功能**: - **在站点页头上添加“LogOut”链接**:说明如何在网站中添加退出链接。 - **退出是怎么...

    springsecurity3x快速构建企业级安全

    - Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...

    springsecurity3.1.pdf

    标题: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参考文档及SpringSecurity参考文档

    Spring Security则是在Spring框架基础上构建的安全管理组件,为应用程序提供了全面的身份验证、授权和访问控制功能。 Spring框架的主要组成部分包括: 1. **IoC容器**:是Spring的核心,负责管理对象的生命周期和...

    Spring Security 源码

    Spring Security支持OAuth2协议,允许第三方应用通过授权获取用户资源。这对于构建API或微服务环境中的身份验证和授权非常有用。 9. **配置**: Spring Security的配置可以通过XML、Java配置或者使用`@...

    SpringSecurity素材.zip

    9. **OAuth2集成**:SpringSecurity可以与OAuth2协议结合,实现身份验证和授权的开放标准,便于构建API和第三方应用集成。 10. **Web安全配置**:SpringSecurity提供了基于Java或XML的配置方式,可以精细控制Web...

    Spring Security 安全权限管理手册 PDF

    Spring Security提供了OAuth2客户端和服务端的实现,手册将详细阐述如何配置和使用这些功能。 此外,Spring Security还提供了对Remember-Me服务的支持,允许用户在一段时间内无需再次登录。手册将指导读者如何设置...

Global site tag (gtag.js) - Google Analytics