SpringBoot 3.x中的JWT与OAuth2认证:构建安全、高效的认证机制

举报
bug菌 发表于 2025/08/25 15:34:18 2025/08/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 📝 前言:安全性,现代应用的核心要素 🔒在当今的应用开发中,安全性...

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

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

📝 前言:安全性,现代应用的核心要素 🔒

在当今的应用开发中,安全性是至关重要的。尤其是在微服务架构和分布式系统中,认证和授权变得尤为复杂。幸运的是,Spring Boot 提供了强大的安全框架支持,包括 JWT(JSON Web Token)和 OAuth2 认证机制。它们能帮助开发者实现高效、安全的用户认证和权限管理。

今天,我们将探讨如何在 Spring Boot 3.x 中实现 JWT 认证,如何配置 Spring Security 来集成 JWT 进行身份验证,以及如何使用 OAuth2 授权码流程实现第三方登录,确保你的应用既安全又易于扩展。🔑

🔑 1. JWT(JSON Web Token)的原理与应用场景 🌐

📌 JWT的基本原理

JWT(JSON Web Token)是一种轻量级的、基于 JSON 的身份验证和信息交换机制。JWT 可以安全地在不同的系统之间传递信息,因为它通过数字签名来确保数据的完整性和真实性。JWT 通常包含三个部分:

  1. Header(头部):描述令牌的元数据,通常包括令牌的类型(JWT)和签名算法(如 HMAC SHA256 或 RSA)。
  2. Payload(有效载荷):包含声明(Claims),可以是用户信息、权限等内容。通常有三种类型的声明:
    • 注册声明(如 subiat 等)
    • 公共声明(自定义)
    • 私有声明(客户端与服务端之间共享)
  3. Signature(签名):用于验证令牌的有效性,防止数据被篡改。它是通过指定的算法(例如 HMAC SHA256)对 header 和 payload 进行签名,使用一个密钥生成。

JWT 的一个关键特点是它是无状态的,即服务器不需要存储会话信息。每个请求都包含 JWT 令牌,服务端仅需验证令牌的有效性即可。

📌 JWT的应用场景
  • 无状态认证:JWT 最常用于无状态认证,尤其是在单点登录(SSO)和分布式系统中。每次请求都携带 JWT 令牌,服务端只需要验证令牌,而无需查询数据库或会话。
  • API身份验证:JWT 也广泛应用于 API 身份验证,尤其是 RESTful API 中,客户端和服务端可以通过 JWT 交换用户信息。
  • 跨域认证:JWT 的另一个优点是,它可以跨域传递身份信息,适用于多平台的应用场景。

🛠️ 2. 在Spring Boot中实现JWT认证 🔑

📌 JWT生成、解析与验证
  1. 生成JWT

JWT 令牌通常是在用户登录后生成的,生成过程包括:

  • 创建用户信息(payload)
  • 使用密钥对数据进行签名
  • 将结果拼接成 header.payload.signature 形式的字符串

JWT生成的示例代码:

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

public class JwtUtil {

    private static final String SECRET_KEY = "mysecretkey";  // 请使用更加安全的密钥

    // 生成JWT
    public static String generateToken(String username) {
        return Jwts.builder()
                   .setSubject(username)  // 用户名
                   .setIssuedAt(new Date())  // 设置签发时间
                   .setExpiration(new Date(System.currentTimeMillis() + 3600000))  // 设置过期时间(1小时)
                   .signWith(SignatureAlgorithm.HS256, SECRET_KEY)  // 使用HS256算法签名
                   .compact();
    }
}
  1. 解析JWT

解析过程包括:

  • 验证JWT的签名
  • 从JWT中提取payload部分的用户信息

JWT解析的示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;

public class JwtUtil {

    private static final String SECRET_KEY = "mysecretkey";

    // 解析JWT
    public static Claims parseToken(String token) {
        return Jwts.parser()
                   .setSigningKey(SECRET_KEY)
                   .parseClaimsJws(token)
                   .getBody();
    }

    // 从JWT中获取用户名
    public static String getUsername(String token) {
        return parseToken(token).getSubject();
    }
}
  1. 验证JWT

在每个请求中,服务器会验证请求头中的 JWT 是否有效。常见的验证步骤包括:

  • 检查 JWT 的签名是否有效
  • 检查 JWT 是否过期
📌 配置Spring Security集成JWT认证

Spring Security 提供了强大的认证和授权功能,结合 JWT,我们可以实现基于令牌的认证。

  1. 添加Spring Security依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 配置JWT认证过滤器
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private static final String HEADER_STRING = "Authorization";
    private static final String TOKEN_PREFIX = "Bearer ";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        String header = request.getHeader(HEADER_STRING);
        if (header != null && header.startsWith(TOKEN_PREFIX)) {
            String token = header.replace(TOKEN_PREFIX, "");
            try {
                String username = JwtUtil.getUsername(token);  // 从JWT中获取用户名
                if (username != null) {
                    UsernamePasswordAuthenticationToken authentication =
                            new UsernamePasswordAuthenticationToken(username, null, null);  // 创建认证对象
                    SecurityContextHolder.getContext().setAuthentication(authentication);  // 设置认证信息
                }
            } catch (Exception e) {
                // JWT验证失败
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            }
        }
        chain.doFilter(request, response);  // 继续执行后续过滤器
    }
}
  1. 配置Spring Security的安全设置
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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()  // 禁用CSRF保护
            .authorizeRequests()
            .antMatchers("/login", "/register").permitAll()  // 不需要认证的路径
            .anyRequest().authenticated();  // 其他路径需要认证
    }
}

🔄 3. 使用OAuth2授权码流程进行第三方登录 🔑

OAuth2 是一种授权框架,通常用于实现第三方登录。在 Spring Boot 中,我们可以轻松集成 OAuth2 来实现基于授权码的第三方登录。

  1. 配置OAuth2客户端

application.yml 中配置第三方认证提供者(例如,Google、GitHub 等)。

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-client-id
            client-secret: your-client-secret
            scope: profile, email
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        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
  1. 控制器接收授权码

在登录后,OAuth2 认证服务器会回调到指定的 redirect-uri,并携带授权码。Spring Security 会自动处理授权码并获取访问令牌。

@Controller
public class OAuth2LoginController {

    @GetMapping("/login/oauth2/code/google")
    public String oauth2LoginSuccess() {
        // 用户登录成功,可以获取到用户信息
        return "redirect:/home";
    }
}

🔚 结语:实现安全认证,保护应用 🔒

通过集成 JWT 和 OAuth2,Spring Boot 3.x 能够为现代 Web 应用提供强大且灵活的身份验证与授权机制。JWT 提供了一种轻量级且无状态的认证方式,非常适用于分布式系统,而 OAuth2 则非常适合实现第三方登录功能,帮助你轻松地接入社交平台或其他外部认证系统。

通过今天的学习,你应该能够在 Spring Boot 中实现基于 JWT 的认证,集成 OAuth2 进行第三方登录,并确保你的应用安全、灵活和高效。希望这篇文章能帮助你在实际项目中构建更加安全和可扩展的应用!🔐


希望这篇文章能为你提供实用的JWT和OAuth2集成技术,助力你在项目中实现强大且灵活的认证和授权!

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学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个月内不可修改。