Spring Boot 与 Spring Security OAuth 2.0:实现授权与认证!

举报
bug菌 发表于 2025/07/16 16:02:26 2025/07/16
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 📜 前言:为什么选择OAuth 2.0?随着现代Web应用的复杂度日...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

📜 前言:为什么选择OAuth 2.0?

随着现代Web应用的复杂度日益增加,传统的基于用户名和密码的认证方式已经无法满足大规模、高并发、分布式系统的需求。OAuth 2.0作为一种开放的授权协议,允许第三方应用在不暴露用户凭证的前提下,访问用户在资源服务器上的数据。OAuth 2.0的灵活性、可扩展性以及与多方服务的兼容性使其成为当今互联网应用中广泛使用的标准。

Spring Security OAuth 2.0是Spring Security的一部分,提供了对OAuth 2.0的全面支持。通过Spring Boot与Spring Security OAuth 2.0的集成,开发者可以轻松实现基于OAuth 2.0的授权与认证机制,支持多种身份认证场景(如客户端凭证授权、授权码授权、JWT认证等)。不仅如此,Spring Security OAuth 2.0还支持JWT(JSON Web Token),进一步提升了系统的安全性和可扩展性。

本文将深入探讨如何使用Spring Boot与Spring Security OAuth 2.0实现用户认证与授权,包含OAuth 2.0授权服务器的配置、OAuth 2.0与JWT结合的认证流程,以及如何利用Spring Boot快速实现安全认证系统。

🧑‍💻 1️⃣ 使用Spring Boot与Spring Security OAuth 2.0实现授权与认证

🛠️ OAuth 2.0概述

OAuth 2.0是一种授权协议,允许用户授权第三方应用访问自己的资源,而无需暴露用户名和密码。OAuth 2.0标准包括以下几个重要角色:

  • 资源所有者(Resource Owner):通常是用户,拥有数据的访问权限。
  • 客户端(Client):请求资源的应用,代表资源所有者访问数据。
  • 授权服务器(Authorization Server):颁发访问令牌的服务器,验证客户端请求的合法性。
  • 资源服务器(Resource Server):存储受保护资源的服务器,使用访问令牌来验证请求的合法性。

OAuth 2.0协议的核心流程通常是:

  1. 客户端向授权服务器请求授权码。
  2. 授权服务器验证用户身份,授予授权码。
  3. 客户端使用授权码向授权服务器请求访问令牌(Access Token)。
  4. 客户端使用访问令牌访问资源服务器上的受保护资源。

🛠️ 步骤 1:引入Spring Security OAuth 2.0依赖

要在Spring Boot项目中实现OAuth 2.0,我们需要引入Spring Security相关的依赖。下面是pom.xml中的必要依赖:

<dependencies>
    <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>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-authorization-server</artifactId>
        <version>0.2.1</version>  <!-- OAuth 2.0授权服务器支持 -->
    </dependency>
</dependencies>
  • spring-boot-starter-oauth2-client:Spring Boot OAuth 2.0客户端支持,适用于OAuth 2.0认证流程。
  • spring-boot-starter-oauth2-resource-server:Spring Boot OAuth 2.0资源服务器支持,用于保护API资源。
  • spring-security-oauth2-authorization-server:Spring Security提供的OAuth 2.0授权服务器实现,用于颁发令牌。

🛠️ 步骤 2:配置OAuth 2.0客户端

application.propertiesapplication.yml中配置OAuth 2.0客户端的相关信息。这里的配置包括OAuth 2.0认证的客户端ID、客户端密钥、回调URI等。

spring.security.oauth2.client.registration.google.client-id=YOUR_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=YOUR_CLIENT_SECRET
spring.security.oauth2.client.registration.google.scope=profile,email
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth

代码解析:

  • client-idclient-secret:这些是从OAuth 2.0提供商(如Google、GitHub等)注册应用时获得的客户端ID和密钥。
  • scope:指定请求的权限范围,在这里我们请求了profileemail的访问权限。
  • redirect-uri:OAuth 2.0认证成功后的回调地址,Spring Security会自动处理OAuth流程。
  • token-uriauthorization-uri:分别是令牌交换和授权码请求的URL。

Spring Boot会根据这些配置自动完成OAuth 2.0认证流程,处理令牌交换和重定向等过程。

🧑‍💻 2️⃣ 基于Spring Boot的OAuth 2.0授权服务器配置与实现

🛠️ 配置OAuth 2.0授权服务器

在一些应用场景中,Spring Boot也可以作为OAuth 2.0授权服务器,管理授权码和令牌的发放。Spring Security提供了OAuth 2.0授权服务器的实现,帮助开发者快速配置OAuth 2.0认证流程。

步骤 1:添加OAuth 2.0授权服务器依赖

pom.xml中添加Spring Security OAuth 2.0授权服务器的依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-authorization-server</artifactId>
    <version>0.2.1</version>
</dependency>

步骤 2:配置授权服务器

创建一个配置类,配置OAuth 2.0授权服务器的各个参数,包括授权码端点、令牌交换端点和客户端注册信息。

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.oauth2.server.authorization.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.server.authorization.client.ClientRegistration;
import org.springframework.security.oauth2.server.authorization.client.InMemoryClientRegistrationRepository;

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig {

    @Bean
    public InMemoryClientRegistrationRepository clientRegistrationRepository() {
        ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("my-client")
            .clientId("my-client-id")
            .clientSecret("my-client-secret")
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .redirectUri("{baseUrl}/login/oauth2/code/{registrationId}")
            .build();
        return new InMemoryClientRegistrationRepository(clientRegistration);
    }

    @EnableAuthorizationServer
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/oauth2/authorize", "/oauth2/token").permitAll()  // 允许认证端点的访问
            .anyRequest().authenticated();  // 其他请求需要认证
    }
}

代码解析:

  • @EnableAuthorizationServer:启用OAuth 2.0授权服务器功能。
  • clientRegistrationRepository():配置OAuth 2.0客户端的注册信息,包含clientIdclientSecret、授权类型等。
  • configure(HttpSecurity http):配置哪些端点允许未认证的访问,确保/oauth2/authorize/oauth2/token端点是开放的。

授权服务器配置完成后,用户可以通过OAuth 2.0的授权码流程进行认证和获取令牌。

🧑‍💻 3️⃣ 使用Spring Boot实现OAuth 2.0与JWT结合的认证流程

🛠️ 什么是JWT?

**JWT(JSON Web Token)**是一种用于安全传递信息的开放标准,它允许服务器和客户端在不共享任何敏感信息的情况下,传递声明性的信息。JWT通常用于OAuth 2.0认证过程中,作为访问令牌(Access Token)携带用户的身份信息和权限。

JWT包含三部分:

  1. 头部(Header):指定JWT的类型(通常是JWT)和签名算法(如HS256)。
  2. 有效载荷(Payload):存储用户信息、权限和过期时间等。
  3. 签名(Signature):保证JWT的完整性,防止篡改。

🛠️ 步骤 1:配置JWT令牌生成与验证

为了实现基于JWT的OAuth 2.0认证,我们需要在Spring Boot中配置JWT令牌的生成与验证。使用jjwt库可以轻松处理JWT的生成和解析。

步骤 2:添加JWT依赖

pom.xml中添加JWT库依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.2</version>
</dependency>

步骤 3:配置JWT生成与验证

创建JwtTokenProvider类来生成和解析JWT令牌:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtTokenProvider {

    private String secretKey = "secret";

    // 生成JWT令牌
    public String generateToken(String username) {
        return Jwts.builder()
            .setSubject(username)
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 86400000))  // 设置过期时间为24小时
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
    }

    // 从JWT令牌中提取用户名
    public String getUsernameFromToken(String token) {
        return Jwts.parser()
            .setSigningKey(secretKey)
            .parseClaimsJws(token)
            .getBody()
            .getSubject();
    }

    // 验证JWT令牌的有效性
    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

代码解析:

  • generateToken(String username):生成JWT令牌,并设置过期时间为24小时。
  • getUsernameFromToken(String token):从JWT令牌中提取用户名。
  • validateToken(String token):验证JWT令牌是否有效,确保令牌没有过期或被篡改。

🛠️ 步骤 4:集成OAuth 2.0与JWT结合的认证流程

将OAuth 2.0与JWT结合使用时,我们可以通过配置spring.security.oauth2.resourceserver.jwt.jwt-uri来验证JWT令牌的签名,并确保客户端访问受保护资源时使用有效的JWT令牌。

spring.security.oauth2.resourceserver.jwt.jwt-uri=https://your-authorization-server/.well-known/jwks.json

代码解析:

  • jwt-uri:指定JWT公钥的URI,用于验证JWT令牌的签名。

🚀 小结:实现高效的OAuth 2.0认证与授权

通过本篇文章,我们深入学习了如何在Spring Boot中集成OAuth 2.0授权与认证,包括OAuth 2.0客户端、授权服务器和JWT认证的配置与实现。Spring Boot与Spring Security OAuth 2.0的结合,简化了OAuth 2.0认证流程,让开发者能够快速实现认证与授权机制,满足现代Web应用和微服务架构的需求。

🚀 总结:提升系统安全性与可扩展性

OAuth 2.0和JWT作为现代Web应用中常用的认证与授权协议,通过Spring Boot与Spring Security的无缝集成,能够帮助开发者高效地实现身份验证和资源授权。本文介绍了如何配置OAuth 2.0授权服务器、OAuth 2.0客户端和资源服务器,结合JWT实现无状态的认证流程,从而提升应用的安全性、可扩展性和可靠性。

通过这些技术,你能够在复杂的分布式环境中实现安全、灵活且高效的身份认证和授权系统,确保数据安全并支持跨平台服务的无缝集成。

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。