Spring Security 3定制记住了我

时间:2011-12-07 03:13:36

标签: spring-security

我想更改记住我的请求参数以覆盖默认参数'_spring_security_remember_me' 和自定义我记住我的服务来替换<remember-me />命名空间配置。

所以我配置了我的记忆服务:

<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
    <property name="key" value="MY_REMEMBER_ME_KEY" />
    <property name="cookieName" value="MY_REMEMBER_ME_COOKIE" />
    <property name="parameter" value="remember" />
    <property name="tokenValiditySeconds" value="1209600" />
    <property name="useSecureCookie" value="true" />
    <property name="userDetailsService" ref="userDetailsService" />
    <property name="alwaysRemember" value="false" />
</bean>

命名空间配置:

<intercept-url pattern="/secure/index" access="ROLE_ADMIN" />
<remember-me services-ref="rememberMeServices"/>

当我运行应用程序并登录时。我发现cookie已创建然后我关闭我的ie并重新打开。 进入路径'/ secure / index',tomcat告诉我访问被拒绝。 但我恢复到Spring Security默认配置,一切正常。

我调试代码发现

RememberMeAuthenticationFilter#doFilter
...
Authentication rememberMeAuth = rememberMeServices.autoLogin(request, response);
...
//autoLogin(request, response) method code.
String rememberMeCookie = extractRememberMeCookie(request);
...
protected String extractRememberMeCookie(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();

    if ((cookies == null) || (cookies.length == 0)) {
        return null;
    }

    for (int i = 0; i < cookies.length; i++) {
        if (cookieName.equals(cookies[i].getName())) {
            return cookies[i].getValue();
        }
    }

    return null;
}

在方法extractRememberMeCookie(request)中,当我使用自定义记住我服务时,代码request.getCookies()总是返回null,但我还原Spring Security默认命名空间<remember-me/>并执行相同操作(干净的Cookie - 登录 - 关闭ie - 重新打开 - 进入路径'/ secure / index'),我也发现cookie是创建的。 我调试代码,我发现request.getCookies()返回cookie名称'SPRING_SECURITY_REMEMBER_ME_COOKIE'并成功验证。

需要其他配置来记住我的身份验证吗? 但我不知道,有人会帮助我。

3 个答案:

答案 0 :(得分:2)

您的<remember-me />仍然需要密钥

这应该是

<remember-me key="MY_REMEMBER_ME_KEY" services-ref="rememberMeServices"/>

答案 1 :(得分:0)

根据TokenBasedRememberMeServices的文档,

  

org.springframework.security.core.userdetails.UserDetailsService是   这个实现需要,以便它可以构造一个有效的   从返回的身份验证   org.springframework.security.core.userdetails.UserDetails。这是   也是必要的,以便用户的密码可用并且可以   作为编码cookie的一部分进行检查。

也许您的配置不正确/不完整。

答案 2 :(得分:0)

这实际上是一个老帖子。但我刚刚遇到问题request.getCookies() null w / Spring 4。

我已移除useSecureCookie = true来修复它。