Spring Seucrity的Remember Me机制(一)

Tags: java spring

介绍

这篇教程将介绍如何启用和配置Spring Security的Remember-me功能,Spring Security已经在使用Spring Secury开发安全的MVC应用程序 - 表单登录示例这篇文章中介绍过了。

Remember-me机制用于在多个会话中标识用户信息,所以首先需要理解的时Remember-me机制仅仅实在Session失效后才起作用。默认情况下,Session在30分钟后失效,但是可以通过修改web.xml配置来改变失效时间,参考下面的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>

    ...
    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

</web-app>

2. Spring Security 的XML配置

需要在Spring配置文件中增加security命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

    <http use-expressions="true">
        <intercept-url pattern="/anonymous*" access="isAnonymous()" />
        <intercept-url pattern="/login*" access="permitAll" />
        <intercept-url pattern="/**" access="isAuthenticated()" />

        <form-login login-page='/login.html' authentication-failure-url="/login.html?error=true" />
        <logout delete-cookies="JSESSIONID" />

        <remember-me key="uniqueAndSecret"/>
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="user1" password="user1Pass" authorities="ROLE_USER" />
                <user name="admin1" password="admin1Pass" authorities="ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

可以看到,基础配置使用元素非常简单,然而可以通过其他配置元素保持灵活性。属性key很重要:它是为应用程序的生成令牌的私有加密值

此外,令牌的有效时间默认为两周,也可以通过下面方法配置(单位:秒),比如配置为1天:

<remember-me key="uniqueAndSecret" token-validity-seconds="86400"/>

3. 登陆表单

下面是我们的登陆表单:

<html>
<head></head>

<body>
    <h1>Login</h1>

    <form name='f' action="j_spring_security_check" method='POST'>
        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='j_username' value=''></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='j_password' /></td>
            </tr>
            <tr>
                <td>Remember Me:</td>
                <td><input type="checkbox" name="_spring_security_remember_me" /></td>
            </tr>
            <tr>
                <td><input name="submit" type="submit" value="submit" /></td>
            </tr>
        </table>
    </form>

</body>
</html>

注意:checkbox控件映射到_spring_security_remember_me,这个名字在Spring 3.1中无法被修改,在Spring 3.2及以上版本可以被修改。

4. Cookie

当用户登陆时,Remember-me机制会创建额外的cookie,cookie的key为:SPRING_SECURITY_REMEMBER_ME_COOKIE

Remember-me cookie包含以下内容:

  • 用户名:用来识别登陆的用户

  • 到期时间:在到达这个时间后使cookie失效,默认为2周

  • MD5哈希值:包含前两个值(用户名和到期时间),另外加上密码以及配置文件中定义的key。

要注意的是,cookie中包含用户名和密码信息,因此,如果其中一个发生改变,那么cookie将失效。

另一个要注意的是,如果Remember-me的cookie被捕获,这种机制可能是脆弱的。被捕获的cookie是有效地、可用的直到cookie过期失效或cookie部分包含的值被修改。

  1. 实践 要检查Remember-me机制是否工作非常简单,仅需要:

  2. 登陆系统使Remember-me启用

  3. 等待session失效(或者删除浏览器中JSESSIONID对应的cookie)

  4. 刷新页面

如果Remember-me机制未启用,当cookie失效后用户会被跳转到登陆页面。否则,用户会停留在当前已登录页面。

6. 结论

这篇文章介绍了如何配置Spring Security的Remember-me机制,并且简要讨论了cookie中所包含的内容。这篇教程的源代码可以在GitHub上下载,是一个Eclipse工程,它很容易导入及运行。

本地工程配置完成并运行后,登陆页面可以通过localhost打开。

本文链接:http://www.4byte.cn/learning/119969/spring-seucrity-de-remember-me-ji-zhi-yi.html