gpt4 book ai didi

带有 OAuth2 丢失 session 的 Spring Security

转载 作者:行者123 更新时间:2023-12-03 17:12:02 32 4
gpt4 key购买 nike

我们有一个使用 Spring Security、OAuth2 登录和 Zuul 路由的基于 Spring Boot 的网关。它还使用 Spring Session 在 Redis 中存储 session 。此网关在 session 中存储 OAuth2 token 并将 OAuth2 承载 token 转发到后端服务。
我们有一个问题,即用户经常被注销。这似乎大约每小时发生一次。我们甚至不太确定是什么导致了所有不同的工具到位。
我们在浏览器中的 session cookie 会在更长的时间内过期。所以我怀疑是 Spring 使 session 无效,或者 OAuth2 token 过期。
从代码的快速检查看来,OAuth2TokenRelayFilter支持刷新 token 。这样对吗?
如何找出造成这种情况的原因并解决它?
作为引用,我们正在使用这些版本:

  • Spring Boot 2.1.12
  • Spring Cloud Greenwich.SR4

  • 以下是一些相关的片段。
    我们的网页安全配置。
    @Configuration
    @EnableWebSecurity
    @EnableOAuth2Sso
    @Order(SecurityProperties.BASIC_AUTH_ORDER - 2)
    @Profile("!security-disabled")
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter
    {
    @Override
    public void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
    .authorizeRequests()
    .antMatchers("/login", "/login/**", "/favicon.ico").permitAll()
    .antMatchers("/signout").authenticated()
    .anyRequest().hasAnyRole("ADMIN", "MEMBER")
    .and()
    .csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
    .and()
    .httpBasic()
    .disable()
    .formLogin()
    .disable()
    .logout()
    .logoutUrl("/signout")
    .deleteCookies("SESSION")
    .and()
    // @formatter:on
    }
    API 路径的安全配置。
    @Configuration
    @Order(SecurityProperties.BASIC_AUTH_ORDER - 2 - 10)
    @Profile("!security-disabled")
    public class ApiSecurityConfig extends WebSecurityConfigurerAdapter
    {
    public void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http.requestMatchers()
    .antMatchers("/api/**")
    .and()
    .authorizeRequests()
    .antMatchers("/**").hasAnyRole("ADMIN", "MEMBER")
    .and()
    .csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
    .and()
    .headers()
    .frameOptions().sameOrigin()
    .and()
    .httpBasic()
    .disable()
    .formLogin()
    .disable()
    .logout()
    .disable()
    .exceptionHandling().authenticationEntryPoint(new Http403ForbiddenEntryPoint());
    // @formatter:on
    }

    }
    更新
    我们已经对 Spring 内部进行了一些调试。首先,我们发现我们缺少一个 OAuth2RestTemplate .每 OAuth2 Boot documentation我们找到了如何添加它:
    @Bean
    public OAuth2RestTemplate oauth2RestTemplate(
    OAuth2ClientContext oauth2ClientContext,
    OAuth2ProtectedResourceDetails details)
    {
    return new OAuth2RestTemplate(details, oauth2ClientContext);
    }

    现在当 OAuth2TokenRelayFilter 时抛出异常电话 restTemplate.getAccessToken().getValue(); .

    A redirect is required to get the users approval


    这个异常是从 AuthorizationCodeAccessTokenProvider 抛出的.

    最佳答案

    OAuth2TokenRelayFilter
    OAuth2TokenRelayFilter是一个预类型过滤器,它使用 ACCESS_TOKEN 和 TOKEN_TYPE 设置上下文,这将用于进一步的身份验证。它使用 getAccessToken() 验证 token 方法并以 401 状态响应“无法获得有效的访问 token ”。

    您可以检查 token 的有效性,并且刷新 token 已正确配置为 grant_type as refresh_token as 当访问 token 过期时,客户端使用刷新 token 授予类型将刷新 token 交换为访问 token ,这允许客户端继续拥有有效的访问 token ,无需与用户进一步交互。

    如果您想禁用 OAuth2TokenRelayFilter,您可以使用以下方法

    zuul.OAuth2TokenRelayFilter.pre.disable=true

    关于带有 OAuth2 丢失 session 的 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799370/

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