根据https://github.com/spring-projects/spring-security/issues/6742 看来是故意不刷新令牌:
ID 令牌通常带有到期日期。 RP 可能
依靠它来使 RP 会话过期。
春天没有。最后提到了两个增强功能,它们应该可以解决一些刷新问题 - 两者都仍然开放。
作为一种解决方法,我实现了一个 GenericFilterBean,它检查令牌并清除当前安全上下文中的身份验证。因此需要一个新的令牌。
@Configuration
public class RefreshTokenFilterConfig {
@Bean
GenericFilterBean refreshTokenFilter(OAuth2AuthorizedClientService clientService) {
return new GenericFilterBean() {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication instanceof OAuth2AuthenticationToken) {
OAuth2AuthenticationToken token = (OAuth2AuthenticationToken) authentication;
OAuth2AuthorizedClient client =
clientService.loadAuthorizedClient(
token.getAuthorizedClientRegistrationId(),
token.getName());
OAuth2AccessToken accessToken = client.getAccessToken();
if (accessToken.getExpiresAt().isBefore(Instant.now())) {
SecurityContextHolder.getContext().setAuthentication(null);
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
};
}
}
此外,我必须将过滤器添加到安全配置中:
@Bean
public WebSecurityConfigurerAdapter webSecurityConfigurer(GenericFilterBean refreshTokenFilter) {
return new WebSecurityConfigurerAdapter() {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(refreshTokenFilter, AnonymousAuthenticationFilter.class)
在 2.2.7.RELEASE 版本中使用 spring-boot-starter-parent 和依赖项实现:
- spring-boot-starter-web
- spring-boot-starter-security
- spring-boot-starter-oauth2-client
我很欣赏有关此解决方法的意见,因为我仍然不确定 Spring Boot 中是否真的需要这样的开销。