You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security OAuth2获取令牌后无法验证:提示匿名用户

问题分析与解决方案

看起来你遇到的核心问题是你的应用虽然配置了OAuth2授权服务器,但没有启用资源服务器的功能,导致系统无法解析请求头中的Bearer令牌,所以始终把你当成匿名用户,甚至禁用匿名后直接抛出认证凭证缺失的异常。

为什么会出现匿名用户的情况?

你的SecurityConfig只是配置了普通的Web安全规则,但没有添加OAuth2资源服务器的过滤器链。Spring Security默认的过滤器链里没有处理Bearer令牌的逻辑,所以当你带着令牌请求/isTagAvailable时,系统根本没去解析令牌,直接走到了AnonymousAuthenticationFilter,自动给你填充了匿名用户的上下文。

禁用匿名后为什么报错?

当你添加.anonymous().disable()后,系统要求所有请求必须经过认证,但依然没有解析令牌的逻辑,SecurityContext里没有Authentication对象,自然就抛出了AuthenticationCredentialsNotFoundException。

解决方案:启用资源服务器配置

因为你的应用同时是OAuth2授权服务器和资源服务器,所以需要添加资源服务器的配置,让系统能够识别并解析Bearer令牌。

步骤1:添加资源服务器配置类

推荐单独创建一个资源服务器配置类(也可以直接在原SecurityConfig上修改,但分开更清晰):

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Value("${spring.application.name}") // 对应你授权服务器配置里的applicationName
    private String applicationName;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        // 配置资源ID,要和授权服务器里的resourceIds一致
        resources.resourceId(applicationName);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // 配置需要认证的接口
                .antMatchers("/isTagAvailable").authenticated()
                // 开放无需认证的接口
                .antMatchers("/robots.txt", "/error", "/login", "/doLogout", "/home", "/pageNotFound").permitAll()
                // 其他所有请求都需要认证
                .anyRequest().authenticated()
            .and()
            .csrf().disable()
            .httpBasic().disable();
    }
}

步骤2:调整原SecurityConfig(可选)

如果你不想单独创建资源服务器配置类,也可以在原SecurityConfig上添加@EnableResourceServer注解,但需要注意:ResourceServerConfigurerAdapter的配置优先级高于WebSecurityConfigurerAdapter,所以原有的HttpSecurity配置会被资源服务器的配置覆盖,需要确保规则正确。

步骤3:验证授权服务器配置一致性

确认授权服务器配置里的resourceIds(applicationName)和资源服务器配置的resourceId(applicationName)完全一致,否则资源服务器会拒绝令牌。

步骤4:检查依赖(确保已添加)

Spring Boot 1.5.x版本需要确保pom.xml里包含OAuth2的starter依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2</artifactId>
</dependency>

验证修复效果

重新启动应用后,再用之前的curl命令调用接口:

$ curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer 00a872f9-6f6e-4073-af17-d07d3991c2f0" -d '{"apiKey": "key", "tag": "tag"}' localhost:8080/isTagAvailable

此时系统应该能正确解析Bearer令牌,不再把你当成匿名用户,也不会抛出认证凭证缺失的异常。

内容的提问来源于stack exchange,提问作者Chloe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:03