Spring Authorization Server中openid-configuration返回404原因排查
问题原因分析
- Spring Security的多个
SecurityFilterChain是按@Order注解指定的优先级执行的,数值越小优先级越高。你的pre过滤器链因为@Order优先级高于OIDC相关的过滤器链,会先拦截所有请求(包括/.well-known/openid-configuration)。 - 即使你把
pre链简化为返回空的HttpSecurity实例,这个链依然会匹配所有请求并完成处理流程——Spring Security会默认允许请求通过,但此时请求会直接进入DispatcherServlet,而不会流转到后面负责处理OIDC端点的过滤器链。 /.well-known/openid-configuration这个端点是由Spring Authorization Server内部的控制器处理的,只有当请求被OIDC专属的过滤器链拦截到,才会被路由到对应的控制器。如果请求被pre链先处理并放行到Servlet,DispatcherServlet会把它当作静态资源查找,自然返回404。
解决方法
- 调整
pre链的优先级:确保pre链的@Order数值大于OIDC过滤器链的默认优先级。Spring Authorization Server的OIDC链默认优先级是SecurityProperties.BASIC_AUTH_ORDER - 10(BASIC_AUTH_ORDER默认值为100,即OIDC链优先级为90),所以你可以给pre链设置@Order(100)或更高数值,让OIDC链先处理相关请求。 - 限定
pre链的处理路径:在pre链的HttpSecurity配置中,通过.requestMatchers()明确指定该链负责处理的请求路径(比如仅处理/api/pre/**这类特定路径),这样/.well-known/openid-configuration就不会被pre链拦截,会自动流转到OIDC链处理。示例配置如下:
@Bean @Order(1) public SecurityFilterChain preSecurityFilterChain(HttpSecurity http) throws Exception { http .requestMatchers(matchers -> matchers.antMatchers("/api/pre/**")) .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) // 其他pre链的配置 return http.build(); }
- 移除不必要的
pre链:如果pre链没有实际业务需求,直接移除该@Bean即可恢复正常。
内容的提问来源于stack exchange,提问作者Simao Gomes Viana
相关产品推荐
相关产品推荐

