【问题标题】:Spring Security 3 custom remember meSpring Security 3 自定义记住我
【发布时间】:2012-01-14 15:34:15
【问题描述】:

我想更改记住我的请求参数以覆盖默认参数“_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 show me access is denied 。 但我恢复到 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 默认命名空间 &lt;remember-me/&gt; 并执行相同操作(清理 Cookies - 登录 - 关闭即 - 重新打开 -入口路径 '/secure/index'),我还发现 cookie 是 create 。 我调试了我找到request.getCookies()的代码,返回cookie名称'SPRING_SECURITY_REMEMBER_ME_COOKIE'并成功验证。

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

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    根据TokenBasedRememberMeServices的文档,

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

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

    【讨论】:

    • 感谢拉古拉姆。但我不知道为什么 request.getCookies() 总是返回 null。 if null 无法验证。
    【解决方案2】:

    您的&lt;remember-me /&gt; 仍然需要密钥

    这应该是

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 2015-05-10
        • 2012-01-21
        • 2014-06-23
        • 1970-01-01
        • 2015-01-30
        • 2014-09-04
        • 2018-12-02
        • 2012-12-14
        相关资源
        最近更新 更多