Spring Boot OAuth2使用AccessToken访问资源时遇权限拒绝问题
我来帮你排查这个权限拒绝的问题,先梳理下当前配置里几个关键的矛盾点和修复方案:
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是否正确加载了用户的权限信息
最后测试步骤
- 重启应用
- 重新获取AccessToken
- 用该Token作为Bearer Token访问你的REST API,验证是否能正常访问
内容的提问来源于stack exchange,提问作者Lijin

