gpt4 book ai didi

spring-security - 带有 oidc : refresh the tokens 的 Spring Security

转载 作者:行者123 更新时间:2023-12-04 06:58:59 28 4
gpt4 key购买 nike

带有 Spring Security 5 的 Spring Boot 2 可以配置为使用 openID 连接 ID 提供程序进行身份验证。
我仅通过配置 Spring Security 就设法设置了我的项目 - 这适用于各种完美预配置的安全机制,例如缓解 session 固定。

但是似乎 Spring Security 在 token 过期时不会自行刷新 token (它们存储在 session 中)。

是否有设置或我必须自己照顾刷新?

更新 : Spring Boot 2.1 已经发布,是时候重新审视这个问题了。我仍然不知道 accessToken 现在是否可以自动刷新,或者我是否必须为此编写代码......

最佳答案

根据 https://github.com/spring-projects/spring-security/issues/6742似乎是故意不刷新 token :

An ID Token typically comes with an expiration date. The RP MAY rely on it to expire the RP session.



Spring 没有。最后提到了两个增强功能,它们应该可以解决一些刷新问题——两者都仍然是开放的。

作为一种解决方法,我实现了一个 GenericFilterBean,它检查 token 并清除当前安全上下文中的身份验证。因此需要一个新的 token 。
@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 中是否真的需要这样的开销。

    关于spring-security - 带有 oidc : refresh the tokens 的 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51790152/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com