3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

本文是关于SpringBoot项目集成用户身份认证的实战教程,主要讲解如何使用JWT生成和校验Token。介绍了引入相关依赖、设计TokenProvider接口、实现JWTTokenProvider类以及配置Web层注入。通过创建和验证Token的示例代码,展示了JWT在身份认证中的应用。

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

前言

书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于Session、Token、JWT的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终采用的是目前流行的基于JWT的Token用户身份认证机制!

本文是实战核心篇,重点是把JWT的核心代码实现! 基于上文我们分析的【用户身份认证】的流程,我们可以确定使用JWT的核心是实现两点:生成Token、校验Token! 接下来我们就来实现它!

本文对应的思维导图:
基于JWT生成和校验Token


专栏介绍

因为可能还有很多同学还不清楚上下文,所以简单介绍一下这个专栏要做的事:

天罡老哥和狗哥(博客主页)有意从0到1带大家搭建一个SpringBoot+SpringCloud+Vue的前后端分离项目!
打造一个短小精悍、技术主流、架构规范的前后端分离实战项目!我负责后端,狗哥负责前端!
目的就是让大家通过项目实战,学到一些真东西,将所学理论落地,助力有心强大的你更快的成长!开启你的工作之旅,让开发游刃有余!

详细的后端规划后端大纲思维导图在开篇已经给出,你可以到开篇查收:基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇


### Spring BootJWT 功能实现 在 Spring Boot 项目集成 JWT(JSON Web Token),可以通过自定义过滤器来验证请求中的令牌并完成身份认证。以下是基于提供的引用内容以及标准实践的解决方案。 #### 配置文件设置 首先,需要在 `application-dev.yml` 文件中配置 JWT 的密钥和其他参数: ```yaml jwt: secretKey: mySecretKey # 密钥字符串 tokenPrefix: Bearer # 前缀 headerString: Authorization # 请求头名称 ``` 上述配置项用于存储生成和解析 JWT 所需的关键信息[^1]。 --- #### 创建 JwtUtil 工具类 为了方便管理 JWT生成与校验,可以创建一个工具类 `JwtUtil` 来封装这些逻辑: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JwtUtil { private String secretKey = "mySecretKey"; // 对应 application-dev.yml 中的 jwt.secretKey public String generateToken(String loginId) { return Jwts.builder() .setSubject(loginId) .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); } public Claims extractAllClaims(String token) { return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody(); } } ``` 此工具类提供了两个核心方法:一个是生成 JWT (`generateToken`);另一个是从 JWT 提取声明 (`extractAllClaims`) [^2]。 --- #### 自定义 Filter 进行拦截 通过继承 `OncePerRequestFilter` 类来自定义过滤器,该过滤器会在每次 HTTP 请求到达控制器之前执行: ```java import org.springframework.stereotype.Component; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtFilter extends OncePerRequestFilter { @Autowired private JwtUtil jwtUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { final String authorizationHeader = request.getHeader("Authorization"); String username = null; String jwt = null; if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { jwt = authorizationHeader.substring(7); try { username = jwtUtil.extractAllClaims(jwt).getSubject(); // 获取用户名 } catch (Exception e) { logger.error("Invalid JWT token", e); } } if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, Collections.emptyList()); SecurityContextHolder.getContext().setAuthentication(authentication); // 设置当前用户的身份 } filterChain.doFilter(request, response); // 继续处理链路 } } ``` 这段代码实现了对请求头部携带的 JWT 进行解析,并将其绑定到 Spring Security 的上下文中。 --- #### 测试用例 编写单元测试以验证 JWT生成与解析过程是否正常工作: ```java @SpringBootTest class JwtTest { @Autowired private JwtUtil jwtUtil; @Test void testJwt() { String accessToken = jwtUtil.generateToken("admin"); System.out.println("Access Token: " + accessToken); Claims claims = jwtUtil.extractAllClaims(accessToken); log.info("Decoded Login ID: {}", claims.getSubject()); Assertions.assertEquals("admin", claims.getSubject()); // 断言解码后的主体是否匹配 } } ``` 运行以上测试案例时,会打印出加密后的访问令牌及其对应的原始登录名。 --- #### 控制器示例 最后,在实际应用中可通过如下方式暴露 API 接口供客户端调用: ```java @RestController @RequestMapping("/api/jwt") public class JwtController { @GetMapping("/testjwt") public ResponseEntity<String> testJwt(@RequestParam String loginId) { String accessToken = new JwtUtil().generateToken(loginId); return ResponseEntity.ok("Access Token Generated: " + accessToken); } } ``` 当访问路径 `/api/jwt/testjwt?loginId=admin` 时,服务器将返回由指定账户生成JWT 访问令牌。 ---
评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天罡gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值