Spring boot security+oauth2 (四)客户端模式

本文详细介绍了OAuth2的客户端模式,包括客户端如何向授权服务器请求令牌(access_token),以及请求的具体参数。客户端模式适用于完全信任的服务器端服务,如合作方系统对接。文章还提供了测试用例和环境搭建步骤。

Spring boot security+oauth2 (四)客户端模式

客户端模式介绍

在这里插入图片描述

(1)客户端向授权服务器发送自己的身份信息,并请求令牌(access_token)
(2)确认客户端身份无误后,将令牌(access_token)发送给client 请求如下:

/oauth/token?client_id=c1&client_secret=secret&grant_type=client_credentials

参数列表如下:

  • client_id:客户端准入标识。
  • client_secret:客户端秘钥。
  • grant_type:授权类型,填写client_credentials表示客户端模式

这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任,而client本身也是安全的。因
此这种模式一般用来提供给我们完全信任的服务器端服务。比如,合作方系统对接,拉取一组用户信息。

测试

POST http://localhost:53020/uaa/oauth/token

环境搭建
Spring boot security+oauth2 (一)授权码模式

在这里插入图片描述

Spring Security OAuth2 客户端授权模式OAuth2 协议中的一种授权方式,适用于客户端应用代表自身而非最终用户进行请求的场景。以下是关于其使用与实现的相关信息: ### 基本概念 客户端授权模式(Client Credentials Grant)允许客户端应用使用自己的凭证(客户端 ID 和客户端密钥)直接从授权服务器获取访问令牌,而无需用户的交互。这种模式通常用于客户端应用需要访问受保护资源,且不需要代表特定用户的情况,例如系统之间的 API 调用。 ### 使用方法 #### 1. 添加依赖 在 Maven 项目中,需要添加 Spring Security OAuth2 相关的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> ``` #### 2. 配置授权服务器信息 在 `application.properties` 或 `application.yml` 中配置授权服务器的信息,包括客户端 ID、客户端密钥、令牌端点等: ```yaml spring: security: oauth2: client: registration: my-client: client-id: your-client-id client-secret: your-client-secret authorization-grant-type: client_credentials scope: read,write provider: my-provider: token-uri: https://example.com/oauth2/token ``` #### 3. 配置 Spring Security 创建一个配置类来配置 Spring Security,启用 OAuth2 客户端授权模式: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction; import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.reactive.function.client.WebClient; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Client(); return http.build(); } @Bean public WebClient webClient(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository) { ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client = new ServletOAuth2AuthorizedClientExchangeFilterFunction( clientRegistrationRepository, authorizedClientRepository); oauth2Client.setDefaultClientRegistrationId("my-client"); return WebClient.builder() .apply(oauth2Client.oauth2Configuration()) .build(); } } ``` #### 4. 使用访问令牌访问受保护资源 在服务层中,可以使用 `WebClient` 来获取访问令牌并访问受保护资源: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; @Service public class ResourceService { @Autowired private WebClient webClient; public String getResource() { return webClient.get() .uri("https://example.com/api/resource") .retrieve() .bodyToMono(String.class) .block(); } } ``` ### 实现方案 #### 1. 授权服务器端实现 授权服务器需要实现 OAuth2 协议的相关端点,包括令牌端点。可以使用 Spring Security OAuth2 提供的 `AuthorizationServerConfigurerAdapter` 来配置授权服务器: ```java import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("your-client-id") .secret("your-client-secret") .authorizedGrantTypes("client_credentials") .scopes("read,write"); } } ``` #### 2. 资源服务器端实现 资源服务器需要验证接收到的访问令牌的有效性,并根据令牌中的信息来授权请求。可以使用 Spring Security OAuth2 提供的 `ResourceServerConfigurerAdapter` 来配置资源服务器: ```java import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.resourceId("resource-id"); } } ``` ### 总结 通过以上步骤,可以实现 Spring Security OAuth2 客户端授权模式的使用。客户端应用可以使用自己的凭证从授权服务器获取访问令牌,并使用该令牌访问受保护资源。授权服务器负责验证客户端的凭证并发放访问令牌,资源服务器负责验证访问令牌的有效性并授权请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值