Rookie690 2024-03-28 13:15 采纳率: 0%
浏览 6
已结题

SpringSecurityOauth2登陆前后request不一致

需求:排查bug
问题描述:
环境:SpringCloud、SpringSecurityOauth2、Gateway
请求oauth2/authorize接口在ExceptionTranslationFilter类中的sendStartAuthentication方法存入缓存的request和登陆成功后
SimpleUrlAuthenticationSuccessHandler回调onAuthenticationSuccess方法getRequest获取到的request地址不一样 导致无法重定向。
需要排查下问题,可能是资源服务器和security服务器的adapter注入顺序有关

img

img

图二是登陆成功后回调,图一时请求oauth2/authorize接口前拦截保存request,调试看到图一和图二的request内存地址不一致,导致无法获取SaveRequest,也就是拿不到回调地址。各位有遇到类似的嘛?网管把代理前的auth/**请求前缀都放开了。

  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-28 13:15
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的场景中,您遇到了SpringCloud、SpringSecurityOauth2和Gateway结合使用时的一个问题,即在OAuth2授权流程中,ExceptionTranslationFilter类在处理/oauth2/authorize请求时缓存的HttpServletRequest对象与登录成功后TenantAuthenticationSuccessHandler回调onAuthenticationSuccess方法中获取到的请求对象不一致,从而导致无法正确重定向。

    首先,我们需要理解Spring Security OAuth2的授权码模式工作流程:

    1. 用户访问受保护资源时,被重定向到/oauth2/authorize端点。
    2. ExceptionTranslationFilter捕获未认证异常,并通过sendStartAuthentication方法将请求缓存以便后续登录成功后的重定向。
    3. 用户登录并验证成功后,认证信息被传递给TenantAuthenticationSuccessHandler
    4. TenantAuthenticationSuccessHandler尝试从缓存中获取原始请求(SavedRequest),但由于某种原因获取的是不同的请求对象,因此无法正确执行重定向逻辑。

    对于这个现象,可能的原因及排查步骤如下:

    • 过滤器链顺序问题:确保ExceptionTranslationFilter在前置过滤器链中的位置正确,确保其在用户认证前能正确保存请求。
    • 请求代理问题:由于使用了Gateway,可能存在代理转发过程中新的HttpServletRequest对象被创建的情况。检查 Gateway 配置是否正确地传递原始请求上下文到安全服务。
    • 跨上下文问题:若资源服务器和安全服务器部署在不同上下文中,可能会造成请求对象的丢失。确保在跨上下文调用时,请求信息得到妥善保留和传递。
    • 请求缓存实现:查看HttpSessionRequestCache或其他自定义实现是否存在问题,确保请求被正确缓存并在成功认证后恢复。

    解决办法:

    1. 确保ExceptionTranslationFilterTenantAuthenticationSuccessHandler都在正确的Spring Security Filter Chain中,并且按照预期顺序执行。

      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
      
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http.addFilterBefore(exceptionTranslationFilter(), UsernamePasswordAuthenticationFilter.class)
                  .formLogin()
                  .successHandler(tenantAuthenticationSuccessHandler())
                  // 其他配置...
          }
      
          @Bean
          public ExceptionTranslationFilter exceptionTranslationFilter() {
              // 初始化并返回ExceptionTranslationFilter实例
          }
      
          @Bean
          public TenantAuthenticationSuccessHandler tenantAuthenticationSuccessHandler() {
              // 初始化并返回TenantAuthenticationSuccessHandler实例
          }
      }
      
    2. 对于Gateway的配置,确保在转发请求到安全服务器时保持原始请求的完整性。可以考虑使用PreserveHostHeaderGlobalFilter等过滤器,或者在路由配置中设置preserve_host_headertrue(根据实际Gateway版本)。

    3. 检查TenantAuthenticationSuccessHandler的初始化过程,确保使用的RequestCache是同一个实例,例如确保共享同一HttpSession

    通过以上排查和调整,应该可以解决SpringSecurityOauth2登录前后request不一致的问题,从而保证登录成功后能正确重定向。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 创建了问题 3月28日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装