java - 为 Spring-Social 实现记住我

标签 java spring-security spring-social

我有一个支持 Spring Security 的项目。我已经使用登录表单实现了记住我,效果很好。但我在登录表单上也有来自 google/facebook 的社交登录,效果很好。问题是他们不记得用户。有没有办法设置类似的“记住我”功能?

我当前的正常登录页面的 spring 配置:

<http access-denied-page="/login?authorization_error=true"
        disable-url-rewriting="true" authentication-manager-ref="formAuthenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <intercept-url pattern="/account/**" access="ROLE_USER" />

        <remember-me key="iRemember"
            token-validity-seconds="1209600" user-service-ref="formClientDetailsUserService" />
        <form-login authentication-failure-url="/login?authentication_error=true"
            default-target-url="/account/" login-page="/login"
            login-processing-url="/login.do" />
        <logout logout-success-url="http://example.com" logout-url="/logout" />
        <anonymous />
    </http>

最佳答案

我有一些类似的需求。

我尝试将用于身份验证的 url 设置为 /auth/facebook?_spring_security_remember_me=true(引用 AbstractRememberMeServices.rememberMeRequested)。但是,org.springframework.social.security.SocialAuthenticationFilter.detectRejection不会不让这过去的。它的编码如下:

protected boolean detectRejection(HttpServletRequest request) {
    Set<?> parameterKeys = request.getParameterMap().keySet();
    return parameterKeys.size() > 0 
            && !parameterKeys.contains("oauth_token") 
            && !parameterKeys.contains("code") 
            && !parameterKeys.contains("scope");
}

我认为如果我们可以在那里添加另一个子句,它就可以工作。然后我想通过子类化 SocialAuthenticationFilter 来覆盖它。但是随后在 SpringSocialConfigurer 中它没有被注入(inject),而是使用 new 关键字实例化。子类化 SpringSocialConfigurer 似乎也不是一个解决方案,因为里面有很多有用的私有(private)字段。因此,我认为一个解决方案是将 SpringSocialConfigurer 复制到另一个类中,并将其与子类 SocialAuthenticationFilter 一起使用。如果我对这一切的理解是正确的,那么这一切看起来就像黑客攻击,我认为我们应该创建一张票以获得适当的记住我支持。

当然,如果我们想让记住我一直在线,通过设置 RememberMeServicesalwaysRemember 字段很容易,我是这样做的:

@Bean
public RememberMeServices rememberMeServices() {

    TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices(rememberMeKey, userService);
    rememberMeServices.setAlwaysRemember(true);
    return rememberMeServices;

}

关于java - 为 Spring-Social 实现记住我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565809/

相关文章:

spring - 如何在 Spring 中将两个参数值放在一个上下文参数中?

facebook - 在 struts2 中使用 spring social

java - 字段authenticationManager LoginController需要一个类型为AuthenticationManager'的bean,但无法找到

java - 将 keystore 路径设置为相对路径时出错

java - Tomcat环境下获取JDBC Driver for MySQL失败

java - 如何比较两个java对象

java - 使用spring security成功登录后如何将对象添加到 View 中?

grails - 如何从 spring-security 获取明文密码?

java - Spring Social - 为 Facebook 好友获取扩展权限

java - 递增变量