Spring Authorization Server自定义Well-Known端点请求转发问题求助
针对你遇到的自定义端点无法命中过滤器、请求被重定向到登录页的问题,按以下步骤排查修复:
1. 替换默认过滤器而非前置添加
不要用addFilterBefore简单插入,先移除默认的OidcProviderConfigurationEndpointFilter,再注册自定义过滤器,避免请求被默认过滤器先拦截:
@Bean public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { // 应用默认授权服务器安全配置 OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); // 移除默认的OIDC配置端点过滤器 FilterChainProxy filterChainProxy = http.getSharedObject(FilterChainProxy.class); filterChainProxy.getFilterChains().forEach(chain -> chain.getFilters().removeIf(filter -> filter instanceof OidcProviderConfigurationEndpointFilter) ); // 初始化自定义过滤器,注入必要依赖 CustomOidcProviderConfigurationEndpointFilter customFilter = new CustomOidcProviderConfigurationEndpointFilter( http.getSharedObject(OidcProviderConfigurationService.class), http.getSharedObject(OAuth2AuthorizationServerMetadata.class) ); // 设置自定义路径的请求匹配器 AntPathRequestMatcher customMatcher = new AntPathRequestMatcher("/oauth2/token/.well-known/openid-configuration"); customFilter.setRequestMatcher(customMatcher); customFilter.setFilterProcessesUrl(customMatcher.getPattern()); // 将自定义过滤器添加到授权端点过滤器之前 http.addFilterBefore(customFilter, OAuth2AuthorizationEndpointFilter.class); // 配置端点权限:允许所有请求访问自定义well-known端点 http.authorizeHttpRequests(auth -> auth .requestMatchers(customMatcher).permitAll() .anyRequest().authenticated() ); return http.build(); }
2. 修正权限配置顺序
请求被重定向到登录页,大概率是permitAll()的配置顺序错误——必须把自定义端点的权限规则放在anyRequest().authenticated()之前,否则会被全局认证规则覆盖。
3. 简化响应属性修改(无需复制整个过滤器)
如果只是要移除响应中的部分属性,没必要完全复制OidcProviderConfigurationEndpointFilter,直接自定义OidcProviderConfigurationService更简洁:
@Bean public OidcProviderConfigurationService customOidcProviderConfigService(OAuth2AuthorizationServerMetadata serverMetadata) { return request -> { // 只构建需要保留的属性,自动移除不需要的字段 return OidcProviderConfiguration.builder() .issuer(serverMetadata.getIssuer()) .authorizationEndpoint(serverMetadata.getAuthorizationEndpoint()) .tokenEndpoint(serverMetadata.getTokenEndpoint()) .jwksUri(serverMetadata.getJwksUri()) // 按需添加或移除属性 .build(); }; }
4. 验证过滤器执行顺序
Spring Security过滤器链按顺序执行,确保自定义过滤器在认证类过滤器(比如UsernamePasswordAuthenticationFilter)之前执行,避免请求被拦截后重定向到登录页。可以通过调整addFilterBefore的第二个参数来指定位置。
内容的提问来源于stack exchange,提问作者Suvin Nimnaka Sukka
相关产品推荐
相关产品推荐

