springCloud整合Oauth2时如何设置资源服务ID

本文介绍了在SpringCloud中整合Oauth2时如何设置资源服务ID,通过重载ResourceServerConfiguration和在OAuth2Configuration中添加clientdetails来避免错误。详细步骤和参考源码链接提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在资源服务配置中重载资源配置方法

···
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http.antMatcher("/client/userinfo").authorizeRequests().anyRequest().authenticated();
    // @formatter:on
}

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.resourceId("authorize-server"); //重点,设置资源id
}

}
···

把资源id加到clientdetails中

···
@Configuration
@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {

public static final String RESOURCE_ID = "bookmarks";

@Autowired
AuthenticationManagerBuilder authenticationManager;

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
    throws Exception {
endpoints.authenticationManager(new AuthenticationManager() {
    @Override
    public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        return authenticationManager.getOrBuild().authenticate(
                authentication);
        }
    });
}

@Override
public void configure(ClientDetailsServiceConfigurer clients)
    throws Exception {

    clients.inMemory()
        .withClient("android-" + RESOURCE_ID)
        .authorizedGrantTypes("password", "authorization_code", "refresh_token")
        .authorities("ROLE_USER")
        .scopes("write")
        .secret("123456")
        .resourceIds(“authorize-server”); //注意这里
}

}
···

否则会报以下错误

{"error":"access_denied",
"error_description":"Invalid token does not contain resource id (oauth2-resource)"
}

参考源码见 https://gitee.com/nnsword/wy2-cloud/tree/master/wy2-springcloud-sample1x

  • 如果觉得有帮忙请推荐给朋友,最好能送颗星,谢谢
<think>好的,用户想了解如何将Spring CloudOAuth2进行整合,需要实现方案和教程。首先,我得回忆一下相关的知识点,可能涉及到Spring Security OAuth2的配置、微服务之间的认证流程以及资源服务器的设置。根据之前提供的引用内容,引用[1]提到整合OAuth2.0实现统一认证授权,客户端通过grant type获取access_token,其他微服务信任该token。引用[2]给出了项目启动类的代码示例,可能涉及Eureka注册中心。引用[3]则指出资源服务ID设置的问题,否则会报错。 接下来,我需要整理整合的关键步骤。首先,基础环境搭建,比如注册中心、配置中心,可能用Eureka。然后认证服务器(Authorization Server)的设置,需要配置客户端信息、令牌存储方式(比如Redis),以及安全配置。接着是资源服务器的配置,确保能验证token并处理资源ID。客户端接入部分,如何获取token并访问资源。另外,需要考虑分布式系统中token的存储和校验,可能用JWT或者Redis共享。 需要确保各个部分配置正确,比如@EnableAuthorizationServer和@EnableResourceServer注解的使用,安全过滤链的配置。资源服务器必须指定资源ID,与客户端配置的scope匹配,否则会出现引用[3]中的错误。同,令牌的存储方式会影响微服务之间的信任,Redis适合分布式环境。 可能用户遇到的问题包括配置错误、依赖冲突、资源ID不匹配等,需要指导如何排查这些问题。例如,检查依赖是否包含spring-boot-starter-securityspring-security-oauth2等,配置文件中的客户端信息是否正确,资源服务器的resource-id是否与token中的scope一致。 最后,生成相关问题,可能涉及优化方案、与其他组件的整合、权限控制扩展等。需要确保回答结构清晰,步骤明确,代码示例正确,符合用户的需求。</think>以下是Spring Cloud整合OAuth2的实现方案及分步教程: ### 一、整合方案核心组件 1. **认证服务(Authorization Server)**:负责颁发/验证access_token,使用$@EnableAuthorizationServer$注解 2. **资源服务(Resource Server)**:受保护的微服务,通过$@EnableResourceServer$注解声明 3. **安全配置**:通过Spring Security配置权限规则 4. **令牌存储**:建议使用Redis实现分布式令牌存储[^2] ### 二、实现步骤 #### 步骤1:搭建基础环境 ```java // 注册中心配置示例(Eureka Server) @EnableEurekaServer @SpringBootApplication public class RegistryApplication { public static void main(String[] args) { SpringApplication.run(RegistryApplication.class, args); } } ``` #### 步骤2:配置认证服务器 ```java @Configuration @EnableAuthorizationServer public class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private RedisConnectionFactory redisConnectionFactory; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("webapp") // 客户端ID .secret("{noop}secret") // 客户端密钥 .authorizedGrantTypes("password", "refresh_token") // 授权模式 .scopes("all") // 作用域 .resourceIds("oauth2-resource"); // 必须配置资源ID[^3] } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints .tokenStore(new RedisTokenStore(redisConnectionFactory)) .authenticationManager(authenticationManager); } } ``` #### 步骤3:配置资源服务器 ```java @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").authenticated() .anyRequest().permitAll(); } @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.resourceId("oauth2-resource"); // 必须与认证服务器配置一致[^3] } } ``` ### 三、关键配置项说明 | 配置项 | 说明 | 示例值 | |----------------------|-----------------------------|------------------| | security.oauth2.client.client-id | 客户端标识符 | webapp | | security.oauth2.client.client-secret | 客户端密钥 | {noop}secret | | security.oauth2.resource.id | 资源服务ID(必须唯一) | oauth2-resource | | security.oauth2.resource.token-info-uri | 令牌验证地址 | http://auth-service/oauth/check_token | ### 四、客户端接入示例 ```java // 获取access_token $curl -X POST \ http://auth-service/oauth/token \ -H 'Authorization: Basic d2ViYXBwOnNlY3JldA==' \ -d 'grant_type=password&username=user&password=123'$ // 访问受保护资源 $curl -H "Authorization: Bearer 6e50e3cd-1b1d-4d8f-a9ab-5a4b5d4c5d5d" http://resource-service/api/data$ ``` ### 五、常见问题解决 1. **Invalid token does not contain resource id**错误 - 检查资源服务器是否配置$resourceId$ - 确认认证服务器颁发的token包含对应资源ID[^3] 2. **令牌存储策略选择** - 单体应用:JWT令牌 - 分布式系统:Redis存储(需配置相同数据源) 3. **权限继承问题** ```java @PreAuthorize("#oauth2.hasScope('all')") @GetMapping("/secure-data") public String getSecureData() { return "Protected Resource"; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值