我有一个支持 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
一起使用。如果我对这一切的理解是正确的,那么这一切看起来就像黑客攻击,我认为我们应该创建一张票以获得适当的记住我支持。
当然,如果我们想让记住我一直在线,通过设置 RememberMeServices
的 alwaysRemember
字段很容易,我是这样做的:
@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/