SpringBoot实现标准的OAuth服务提供商

本文详细介绍了如何在Spring Boot项目中集成并配置Spring Security与OAuth2,包括添加依赖、配置Spring Security和OAuth2,以及实现授权码模式、密码模式和令牌刷新等流程。

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

⒈添加pom依赖

 1         <dependency>
 2             <groupId>org.springframework.boot</groupId>
 3             <artifactId>spring-boot-starter-security</artifactId>
 4         </dependency>
 5         <dependency>
 6             <groupId>org.springframework.boot</groupId>
 7             <artifactId>spring-boot-starter-web</artifactId>
 8         </dependency>
 9         <dependency>
10             <groupId>org.springframework.security.oauth</groupId>
11             <artifactId>spring-security-oauth2</artifactId>
12             <version>2.3.5.RELEASE</version>
13         </dependency>
14         <dependency>
15             <groupId>org.springframework.boot</groupId>
16             <artifactId>spring-boot-starter-test</artifactId>
17             <scope>test</scope>
18         </dependency>
19         <dependency>
20             <groupId>org.springframework.security</groupId>
21             <artifactId>spring-security-test</artifactId>
22             <scope>test</scope>
23         </dependency>

⒉配置SpringSecurity

 1 package cn.coreqi.config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 5 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 6 import org.springframework.security.config.annotation.web.builders.WebSecurity;
 7 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 8 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 9 import org.springframework.security.crypto.password.NoOpPasswordEncoder;
10 import org.springframework.security.crypto.password.PasswordEncoder;
11 
12 @EnableWebSecurity
13 public class CoreqiWebSecurityConfig extends WebSecurityConfigurerAdapter {
14     @Override
15     protected void configure(HttpSecurity http) throws Exception {
16         http.httpBasic()
17                 .and()
18                 .authorizeRequests()
19                 .antMatchers("/oauth/token").permitAll()
20                 .anyRequest().authenticated()  //任何请求都需要身份认证
21                 .and().csrf().disable();    //禁用CSRF
22     }
23 
24 
25 
26     @Override
27     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
28         auth.inMemoryAuthentication()
29                 .withUser("fanqi").password("admin").roles("admin");
30     }
31 
32     @Bean
33     public PasswordEncoder passwordEncoder()
34     {
35         return NoOpPasswordEncoder.getInstance();
36     }
37 }

 

⒊配置OAuth

 1 package cn.coreqi.config;
 2 
 3 import org.springframework.context.annotation.Configuration;
 4 import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
 5 import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurer;
 6 import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
 7 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
 8 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
 9 
10 @Configuration
11 @EnableAuthorizationServer  //开启认证服务器
12 public class CoreqiAuthorizationServerConfig implements AuthorizationServerConfigurer {
13 
14     @Override
15     public void configure(AuthorizationServerSecurityConfigurer authorizationServerSecurityConfigurer) throws Exception {
16 
17     }
18 
19     @Override
20     public void configure(ClientDetailsServiceConfigurer clientDetailsServiceConfigurer) throws Exception {
21         clientDetailsServiceConfigurer.inMemory()
22                 .withClient("coreqi")
23                 .secret("coreqiSecret")
24                 .redirectUris("https://www.baidu.com")
25                 .scopes("ALL")
26                 .authorities("COREQI_READ")
27                 .authorizedGrantTypes("authorization_code");
28     }
29 
30     @Override
31     public void configure(AuthorizationServerEndpointsConfigurer authorizationServerEndpointsConfigurer) throws Exception {
32 
33     }
34 }

⒋测试【如果颁发给用户的令牌没有过期,那么Spring OAuth不会颁发新的令牌,而是将上次的令牌重新返回,不同的是过期时间减少了】

  1.访问http://localhost:8080/登录

    为什么要登录?因为这个地址是我们提供给第三方应用,由第三方应用来引导用户进行授权的,作为服务提供商,我们需要知道,1.是那个应用在请求授权(通过client_id),2.第三方应用在请求我们哪个用户的授权(通过此时登录的用户名密码判断是我们系统中的哪个用户),3.需要我们给第三方应用该用户的哪些权限(通过scope参数,scope参数是由我们自己定义的)。

  2.访问http://localhost:8080/oauth/authorize?response_type=code&client_id=coreqi&redirect_uri=https://www.baidu.com&scope=ALL进行授权,授予权限

    参数介绍:

      response_type:必填,值必须为code

      client_id:必填,客户端id

      redirect_uri:可选,授权码模式下可用

      scope:必须要有,要么在服务器端配置,要么在请求参数中配置。

      state:推荐

  3.跳转到 redirect_uri 【https://www.baidu.com/?code=5HF6y7】拿到授权码

  4.

    ⅰ授权码模式:

      对http://localhost:8080/oauth/token发送post请求,请求头添加Authorization,username为client_id,password为secret。BODY中添加以下参数:

        grant_type:必填,值为authorization_code

        code:授权码

        redirect_uri:可选,授权码模式下可用

        client_id:必填,客户端id

        scope:和上一步请求传一样的值

    

    ⅱ密码模式:

      密码模式实际上是用户把自己在服务提供商的用户名密码告诉了第三方应用,第三方应用拿着用户名密码来服务提供商这里获得授权。这种情况下服务提供商是没法判断这个用户名密码是不是用户真正给你的(万一是你偷的呢)。

      对http://localhost:8080/oauth/token发送post请求,请求头添加Authorization,username为client_id,password为secret。BODY中添加以下参数:      

        grant_type:必填,值为password

        username:服务提供商系统中的用户

        password:服务提供商系统中用户的密码

        scope:和上一步请求传一样的值

      

         密码模式需要对Security和OAuth做一些配置

      

 1 package cn.coreqi.config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.security.authentication.AuthenticationManager;
 5 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 6 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 7 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 8 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 9 import org.springframework.security.crypto.password.NoOpPasswordEncoder;
10 import org.springframework.security.crypto.password.PasswordEncoder;
11 
12 @EnableWebSecurity
13 public class CoreqiWebSecurityConfig extends WebSecurityConfigurerAdapter {
14 
15     @Override
16     @Bean
17     public AuthenticationManager authenticationManagerBean() throws Exception {
18         return super.authenticationManagerBean();
19     }
20 
21     @Override
22     protected void configure(HttpSecurity http) throws Exception {
23         http.httpBasic()
24                 .and()
25                 .authorizeRequests()
26                 .antMatchers("/oauth/token").permitAll()
27                 .anyRequest().authenticated()  //任何请求都需要身份认证
28                 .and().csrf().disable();    //禁用CSRF
29     }
30 
31     @Override
32     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
33         auth.inMemoryAuthentication()
34                 .withUser("fanqi").password("admin").roles("admin");
35     }
36 
37     @Bean
38     public PasswordEncoder passwordEncoder()
39     {
40         return NoOpPasswordEncoder.getInstance();
41     }
42 }

 

 1 package cn.coreqi.config;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.security.authentication.AuthenticationManager;
 7 import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
 8 import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
 9 import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
10 import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
11 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
12 
13 @Configuration
14 @EnableAuthorizationServer  //开启认证服务器
15 public class CoreqiAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
16 
17     @Autowired
18     @Qualifier("authenticationManagerBean")
19     private AuthenticationManager authenticationManager;
20 
21     @Autowired
22     private AuthenticationConfiguration authenticationConfiguration;
23 
24     /**
25      * password模式需要提供一个AuthenticationManager到AuthorizationServerEndpointsConfigurer
26      * @param authorizationServerEndpointsConfigurer
27      * @throws Exception
28      */
29     @Override
30     public void configure(AuthorizationServerEndpointsConfigurer authorizationServerEndpointsConfigurer) throws Exception {
31         authorizationServerEndpointsConfigurer.authenticationManager(authenticationConfiguration.getAuthenticationManager());
32     }
33 
34     @Override
35     public void configure(ClientDetailsServiceConfigurer clientDetailsServiceConfigurer) throws Exception {
36         clientDetailsServiceConfigurer.inMemory()
37                 .withClient("coreqi")
38                 .secret("coreqiSecret")
39                 .redirectUris("https://www.baidu.com")
40                 .scopes("ALL")
41                 .authorities("COREQI_READ")
42                 .authorizedGrantTypes("authorization_code","password");
43     }
44 
45 }

     ⅲ刷新令牌

  

转载于:https://www.cnblogs.com/fanqisoft/p/10662837.html

### Spring Boot 3 中使用 OAuth2 的身份验证和授权 在 Spring Boot 3 中,OAuth2 是一种强大的工具,用于处理用户的身份验证和授权。以下是关于如何配置和实现 OAuth2 认证的具体说明。 #### 添加 Maven 或 Gradle 依赖 为了支持 OAuth2 功能,在项目中需要引入 `spring-boot-starter-oauth2-client` 和 `spring-boot-starter-security` 两个核心依赖项[^1]。对于 Maven 用户,可以在 `pom.xml` 文件中添加如下内容: ```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-security</artifactId> </dependency> ``` Gradle 用户可以添加以下内容: ```gradle implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' ``` --- #### 配置 OAuth2 提供商信息 在 `application.properties` 或 `application.yml` 文件中定义 OAuth2 提供商的相关参数。例如,假设要集成 Google 登录功能,则需设置以下属性[^2]: **application.properties** ```properties spring.security.oauth2.client.registration.google.client-id=<your-google-client-id> spring.security.oauth2.client.registration.google.client-secret=<your-google-client-secret> spring.security.oauth2.client.registration.google.scope=profile,email spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo spring.security.oauth2.client.provider.google.jwk-set-uri=https://www.googleapis.com/oauth2/v3/certs ``` 或者 **application.yml**: ```yaml spring: security: oauth2: client: registration: google: client-id: <your-google-client-id> client-secret: <your-google-client-secret> scope: - profile - email provider: google: authorization-uri: https://accounts.google.com/o/oauth2/auth token-uri: https://oauth2.googleapis.com/token user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo jwk-set-uri: https://www.googleapis.com/oauth2/v3/certs ``` --- #### 创建自定义的安全配置类 可以通过继承 `WebSecurityConfigurerAdapter` 来定制化安全策略。然而需要注意的是,从 Spring Security 5.7 开始,官方建议不再使用此适配器类,而是采用更灵活的方式完成相同的功能[^3]。下面是一个示例代码片段: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .oauth2Login(Customizer.withDefaults()); return http.build(); } @Bean public InMemoryUserDetailsManager userDetailsManager() { UserDetails user = User.builder() .username("user") .password("{noop}password") // 使用明文密码 (仅限开发环境) .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } } ``` 在此配置下,任何未经过身份验证的请求都会被重定向至 OAuth2 提供商进行登录操作。 --- #### 测试 OAuth2 授权流程 启动应用程序后访问受保护页面(如 `/secure-page`),系统会自动跳转到指定的 OAuth2 提供商界面让用户输入凭据并授予权限。成功返回之后即可正常浏览相关内容[^4]。 如果希望直接通过 API 请求 Token 并验证其有效性,可参考 POSTMAN 工具发送 HTTP 请求给认证服务器接口来获取 Access Token[^5]: - URL 地址:http://localhost:8080/oauth2/token - 方法类型:POST - 表头字段:Authorization 值设为 Basic Auth 编码后的 Client ID 和 Secret ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值