JWT - 令牌认证(认证流程和原理、Jwt 工具类、搭配 Redis 使用)

目录

一、JWT 认证

1.1、对 JWT 的认识

1.1.1、JWT 解释

1.1.2、为什么使用的 JWT 认证,而不是 Session 认证?

a)基于传统的 Session 认证

1.1.3、JWT 认证流程

1.1.4、优势

1.1.5、JWT 的结构

JWT 第一部分:标头 Header

JWT 第二部分:有效载荷 Payload 

JWT 第三部分:签名 Signature

1.2、JWT 的使用

1.2.1、实例

a)引入 jwt 依赖

b)生成 Token

c)根据密钥创建验证对象,然后验证 Token

d)执行结果

1.2.2、封装 Jwt 工具类


一、JWT 认证


1.1、对 JWT 的认识

1.1.1、JWT 解释

JWT 是 “JSON Web Token” 的简写,也就是通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全的将信息作为 JSON 对象传输.  在数据传输过程中还可以完成数据加密,签名等相关处理.

这就像是皇上的玉玺,谁见到了哪怕没见过皇上长啥样,都知道是皇上来了.

1.1.2、为什么使用的 JWT 认证,而不是 Session 认证?

<think>好的,我现在需要回答用户关于在Spring Boot项目中使用JWTRedis进行认证授权的具体流程的问题。首先,我得回顾一下用户提供的引用内容,确保回答符合他们的参考资料。 首先,用户提到了三个引用:引用[1]是关于Spring SecurityJWT认证流程解析,引用[2]是整合Spring Boot、Security、RedisJWTCSRF,引用[3]是关于设置父工程Spring Boot版本。这些资料应该作为回答的基础,确保流程正确并符合实际整合方法。 接下来,我需要整理认证授权的流程步骤。根据Spring Security的工作流程,通常包括用户登录、生成JWT、存储令牌、验证令牌等步骤。结合JWTRedis使用,可能需要考虑令牌的存储刷新机制。比如,用户登录成功后生成JWT,并将其存储在Redis中,每次请求时验证JWT的有效性,并从Redis中检查是否存在。 然后,要确保回答的结构清晰,分步骤说明每个环节。可能需要分为用户认证流程权限验证流程两个主要部分。在认证部分,包括提交凭证、验证用户、生成JWT、存储到Redis、返回给客户端等。在权限验证部分,包括客户端携带JWT、过滤器验证、从Redis检查、设置Security上下文、鉴权等。 同时,要注意引用标记的正确添加。例如,在提到生成JWT时,引用[1]可能涉及这部分内容;在整合Redis存储令牌时,引用[2]可能相关。需要确保每个引用的位置自然,不破坏回答的流畅性。 还需要考虑可能的相关问题,比如如何刷新令牌、整合CSRF双认证、性能优化等。这些问题可以放在相关问题部分,帮助用户进一步了解相关主题。 最后,要检查是否遵循了用户给出的系统级指令,比如数学表达式的格式是否正确,使用中文回答,生成相关问题等。虽然这个问题不涉及数学公式,但其他格式要求如代码块的使用、引用标识的添加都需要注意。 总结一下,回答需要分步骤详细说明认证授权的流程,结合JWTRedis使用,正确引用提供的资料,并生成相关问题。确保结构清晰,符合用户的要求。</think>在Spring Boot项目中整合JWTRedis实现认证授权的流程可分为以下步骤: --- ### 一、认证与授权流程核心步骤 1. **用户登录认证** - 用户提交账号密码后,系统通过`UserDetailsService`加载用户信息,验证密码权限[^1]。 - 验证通过后,生成JWT令牌(包含用户ID、角色等),并将令牌存储到Redis中(设置有效期)[^2]。 2. **令牌存储与响应** - 使用Redis的`String`结构存储JWT,Key通常为用户ID或令牌唯一标识,Value为令牌值,例如: ```redis SET user:1001:token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." EXPIRE user:1001:token 3600 # 设置过期时间 ``` 3. **请求鉴权** - 客户端在后续请求的`Authorization`头中携带JWT- 自定义`JwtAuthenticationFilter`拦截请求,解析JWT并验证其合法性: - 校验签名是否有效 - 检查Redis中是否存在该令牌(防止令牌被手动注销) - 通过后,将用户信息存入`SecurityContextHolder`,供后续权限校验使用--- ### 二、关键代码实现 1. **JWT生成与验证工具类** ```java public class JwtUtils { public static String generateToken(UserDetails user) { return Jwts.builder() .setSubject(user.getUsername()) .claim("roles", user.getAuthorities()) .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) .signWith(SignatureAlgorithm.HS512, "your-secret-key") .compact(); } public static Boolean validateToken(String token, UserDetails user) { // 验证签名与过期时间,并与Redis中的令牌比对 } } ``` 2. **自定义认证过滤器** ```java public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { String token = extractToken(request); if (token != null && JwtUtils.validateToken(token)) { String username = JwtUtils.extractUsername(token); UserDetails user = userDetailsService.loadUserByUsername(username); // 检查Redis中是否存在该用户的令牌 if (redisTemplate.hasKey("user:"+username+":token")) { UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth); } } chain.doFilter(request, response); } } ``` --- ### 三、流程优化建议 1. **双Token机制** - 使用`access_token`(短有效期)`refresh_token`(长有效期),减少频繁查询Redis的次数。 2. **黑名单管理** - 主动注销令牌时,将未过期的JWT存入Redis黑名单,拦截时优先检查黑名单。 3. **整合Spring Security配置** ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests() .antMatchers("/api/public/**").permitAll() .antMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated(); } } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈亦康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值