Spring OAuth2.0:如何将原请求查询参数传递至登录页面
解决OAuth认证时原请求查询参数传递至登录页面的问题
我之前在做OAuth认证流程的时候,刚好碰到过和你一模一样的问题!核心痛点就是:当发起需要认证的请求时,OAuth服务器会先保存原请求再重定向到/login,但常规用super(new AntPathRequestMatcher("/login", "GET"))去拿参数根本行不通——因为这时候拿到的已经是重定向后的请求,原请求的查询参数早就丢了。
下面是我当时摸索出来的解决方案,核心思路就是自定义认证入口点,在重定向到登录页之前就把原请求的参数带过去:
步骤1:自定义AuthenticationEntryPoint
继承Spring Security自带的LoginUrlAuthenticationEntryPoint,重写commence方法,在重定向时拼接原请求的查询参数:
public class CustomAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint { public CustomAuthenticationEntryPoint(String loginUrl) { super(loginUrl); } @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { // 获取原请求的完整查询参数 String queryString = request.getQueryString(); String targetLoginUrl = getLoginUrl(); // 如果原请求有查询参数,拼接到登录URL后 if (queryString != null && !queryString.isBlank()) { targetLoginUrl += "?" + queryString; } // 重定向到带参数的登录页面 response.sendRedirect(targetLoginUrl); } }
步骤2:在Spring Security配置中替换默认入口点
把自定义的入口点配置到Security的异常处理逻辑里,这样当需要触发认证时,就会走我们自定义的重定向逻辑:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .exceptionHandling() // 替换成自定义的认证入口点 .authenticationEntryPoint(new CustomAuthenticationEntryPoint("/login")); } }
为什么这样可行?
关键在于:AuthenticationEntryPoint的commence方法是在重定向到/login之前被调用的,此时拿到的HttpServletRequest还是发起认证的原请求,所以能完整获取到原请求的查询参数。把这些参数拼接到登录URL后,重定向过去的/login页面就能拿到参数,进而用来筛选对应的AuthenticationProvider了。
⚠️ 小提醒:如果原请求的参数包含敏感信息,记得要做加密或者过滤处理,避免敏感数据暴露在URL中。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

