Spring Authorization Server无法通过Bearer Token授权API端点请求
解决方案:单模块同时作为授权服务器+资源服务器的Bearer Token认证配置
核心问题
你的问题源于安全过滤器链的规则匹配与优先级冲突:Spring Authorization Server会自动处理默认OAuth2端点(如/userinfo)的Bearer Token认证,但自定义REST API被通用Web安全规则拦截,触发了跳转登录的会话式认证逻辑,而非无状态的Bearer Token认证。这种场景完全可行,只需通过拆分过滤器链解决。
具体操作步骤
1. 补充资源服务器依赖
除Spring Authorization Server依赖外,需引入Spring Security OAuth2资源服务器starter,用于处理Bearer Token验证:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
2. 配置两个独立的SecurityFilterChain
通过@Order指定优先级,分别处理授权服务器端点和自定义API的认证逻辑,避免规则冲突。
授权服务器过滤器链(处理OAuth2授权流程端点)
@Configuration public class AuthorizationServerSecurityConfig { @Bean @Order(1) public SecurityFilterChain authorizationServerFilterChain(HttpSecurity http) throws Exception { // 应用授权服务器默认安全配置 OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); // 启用OIDC(按需选择) http.getConfigurer(OAuth2AuthorizationServerConfigurer.class) .oidc(Customizer.withDefaults()); // 授权流程的登录入口,保留表单登录 http.exceptionHandling(exceptions -> exceptions .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")) ); return http.build(); } }
资源服务器过滤器链(处理自定义REST API)
@Configuration public class ResourceServerSecurityConfig { @Bean @Order(2) public SecurityFilterChain resourceServerFilterChain(HttpSecurity http) throws Exception { http // 精准匹配你的自定义API路径 .securityMatcher("/api/**") .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) // 启用Bearer Token(JWT格式)认证 .oauth2ResourceServer(oauth2 -> oauth2 .jwt(Customizer.withDefaults()) ) // API采用无状态认证,禁用会话创建 .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ); return http.build(); } }
3. 配置JWT验证规则(针对JWT格式的访问Token)
如果授权服务器颁发的是JWT Token,需配置从授权服务器的JWKS端点获取公钥用于验证:
@Configuration public class JwtValidationConfig { @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}") private String jwkSetUri; @Bean public JwtDecoder jwtDecoder() { return NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build(); } }
对应的application.yml配置:
spring: security: oauth2: resourceserver: jwt: jwk-set-uri: http://localhost:8080/oauth2/jwks # 替换为你的授权服务器JWKS端点
4. 验证测试
调用自定义API时,在请求头中携带Authorization: Bearer {你的访问Token},此时请求会直接通过JWT验证完成授权,不会被重定向到登录页。
关键注意事项
- 过滤器链优先级:
@Order数值越小优先级越高,授权服务器的过滤器链需优先匹配自身端点(如/oauth2/**、/login),资源服务器的过滤器链匹配自定义API路径 - 路径匹配精准度:通过
securityMatcher明确限定资源服务器的处理范围,避免与授权服务器端点冲突 - 无状态会话:API服务必须设置
SessionCreationPolicy.STATELESS,符合Bearer Token无状态认证的特性
内容的提问来源于stack exchange,提问作者SoKnight
相关产品推荐
相关产品推荐

