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

Spring Boot OAuth2使用AccessToken访问资源时遇权限拒绝问题

解决Spring Boot OAuth2 Access Token访问API时的Access Denied问题

我来帮你排查这个权限拒绝的问题,先梳理下当前配置里几个关键的矛盾点和修复方案:

1. TokenStore 配置不一致

你的AuthorizationServerConfiguration用的是JwtTokenStore来处理JWT格式的token,但WebSecurityConfiguration却配置了InMemoryTokenStore,这会导致token的存储/解析逻辑完全不统一,资源服务器根本无法正确识别你获取的JWT token,自然会返回权限拒绝。

修复方案:
删除WebSecurityConfiguration里的TokenStore Bean,同时给ResourceServerConfiguration添加JWT解析相关配置,让资源服务器能正确解析JWT token:

修改ResourceServerConfiguration:

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    private static final String RESOURCE_ID = "resource-server-rest-api";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID)
                .tokenStore(tokenStore()) // 配置JWT token存储
                .tokenAccessTokenConverter(defaultAccessTokenConverter()); // 配置JWT转换器
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().anyRequest().authenticated();
    }

    // 复用授权服务器的JWT配置逻辑
    @Bean
    public TokenStore tokenStore(){
        return new JwtTokenStore(defaultAccessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter defaultAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("123"); // 必须和授权服务器的签名密钥完全一致
        return converter;
    }
}

同时删除WebSecurityConfiguration中的这段代码:

@Bean
public TokenStore tokenStore() {
    return new InMemoryTokenStore();
}

2. 客户端未关联资源ID

资源服务器已经指定了RESOURCE_ID = "resource-server-rest-api",但你的客户端配置(通过oAuth2ClientDetailsService加载)必须关联这个资源ID。如果客户端没配置resourceIds,生成的token里不会包含该资源的访问权限,访问时就会被拒绝。

检查&修复:
确认你的客户端存储表(比如oauth_client_details)中,目标客户端的resource_ids字段值包含resource-server-rest-api,例如执行SQL:

UPDATE oauth_client_details SET resource_ids = 'resource-server-rest-api' WHERE client_id = '你的客户端ID';

3. 验证Token内容是否合规

获取到AccessToken后,可以用JWT解析工具打开token,检查两个关键点:

  • aud字段是否包含resource-server-rest-api(资源ID)
  • scope或authorities字段是否包含访问目标API所需的权限

如果token里没有这些信息,需要检查:

  • 客户端的scope配置是否正确
  • MyUserDetailsService是否正确加载了用户的权限信息

最后测试步骤

  1. 重启应用
  2. 重新获取AccessToken
  3. 用该Token作为Bearer Token访问你的REST API,验证是否能正常访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:27:44