Spring 安全 4.0.3 rememberMe tokenValiditySeconds 不工作
Spring Security 4.0.3 rememberMe tokenValiditySeconds not working
我在我的 Spring 安全配置中指定了 1 的 tokenValiditySeconds
,但我一直看到默认值 1209600(在 org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
中找到)出现。我有一个扩展 TokenBasedRememberMeServices
的自定义 "RememberMeService" class(它又扩展了 AbstractRememberMeServices
),但我没有更改 [=28= 中的 tokenValiditySeconds
]...我只是希望它可以从我的安全配置中设置。
除 tokenValiditySeconds
外其他一切正常。我专门为我的 REST 使用它 API(而不是在 Web 表单中)。
如何使我在 Spring 安全配置中指定的 tokenValiditySeconds
应用到我的 RememberMeService 中?这是我的 configure()
方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.frameOptions()
.sameOrigin()
.and()
.authorizeRequests()
.antMatchers("/rest/**").hasRole("ADMIN")
.anyRequest().permitAll()
.and()
.csrf()
.disable()
.httpBasic()
.and()
.rememberMe()
.key(KEY)
.tokenValiditySeconds(1)
.userDetailsService(springUserDetailsService)
.rememberMeServices(new SpringRememberMeService(KEY, springUserDetailsService))
.and()
.logout().disable();
}
决定在我的 SpringRememberMeService
class 中而不是在 rememberMe()
配置器中指定 tokenValiditySeconds
,这工作正常。请注意,为了满足我们的特定需求,我正在覆盖 TokenBasedRememberMeServices
中的几个 classes。
package com.avada.rest.security;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
import javax.servlet.http.HttpServletRequest;
public class SpringRememberMeService extends TokenBasedRememberMeServices {
public static final int TOKEN_VALIDITY_SECONDS = 60 * 30; // 30 minutes
public SpringRememberMeService(String key, UserDetailsService userDetailsService) {
super(key, userDetailsService);
}
@Override
protected String extractRememberMeCookie(HttpServletRequest request) {
String rememberMe = request.getHeader("remember-me");
int startIndex = "remember-me=".length();
int endIndex = rememberMe.indexOf("; ", startIndex);
return rememberMe.substring(startIndex, endIndex);
}
@Override
protected int calculateLoginLifetime(HttpServletRequest request, Authentication authentication) {
return TOKEN_VALIDITY_SECONDS;
}
}
我在我的 Spring 安全配置中指定了 1 的 tokenValiditySeconds
,但我一直看到默认值 1209600(在 org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
中找到)出现。我有一个扩展 TokenBasedRememberMeServices
的自定义 "RememberMeService" class(它又扩展了 AbstractRememberMeServices
),但我没有更改 [=28= 中的 tokenValiditySeconds
]...我只是希望它可以从我的安全配置中设置。
除 tokenValiditySeconds
外其他一切正常。我专门为我的 REST 使用它 API(而不是在 Web 表单中)。
如何使我在 Spring 安全配置中指定的 tokenValiditySeconds
应用到我的 RememberMeService 中?这是我的 configure()
方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.frameOptions()
.sameOrigin()
.and()
.authorizeRequests()
.antMatchers("/rest/**").hasRole("ADMIN")
.anyRequest().permitAll()
.and()
.csrf()
.disable()
.httpBasic()
.and()
.rememberMe()
.key(KEY)
.tokenValiditySeconds(1)
.userDetailsService(springUserDetailsService)
.rememberMeServices(new SpringRememberMeService(KEY, springUserDetailsService))
.and()
.logout().disable();
}
决定在我的 SpringRememberMeService
class 中而不是在 rememberMe()
配置器中指定 tokenValiditySeconds
,这工作正常。请注意,为了满足我们的特定需求,我正在覆盖 TokenBasedRememberMeServices
中的几个 classes。
package com.avada.rest.security;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
import javax.servlet.http.HttpServletRequest;
public class SpringRememberMeService extends TokenBasedRememberMeServices {
public static final int TOKEN_VALIDITY_SECONDS = 60 * 30; // 30 minutes
public SpringRememberMeService(String key, UserDetailsService userDetailsService) {
super(key, userDetailsService);
}
@Override
protected String extractRememberMeCookie(HttpServletRequest request) {
String rememberMe = request.getHeader("remember-me");
int startIndex = "remember-me=".length();
int endIndex = rememberMe.indexOf("; ", startIndex);
return rememberMe.substring(startIndex, endIndex);
}
@Override
protected int calculateLoginLifetime(HttpServletRequest request, Authentication authentication) {
return TOKEN_VALIDITY_SECONDS;
}
}