上一篇我们已经把企业认证体系的全景图串起来了。我们知道JWT Redis Spring Security Gateway在认证链路中的职责分别是什么。但问题来了如果让你从零开始搭建一套认证系统你会怎么做今天我们从工程视角实现一套真实企业项目中常见的Spring Security JWT Redis 认证方案一、需求分析假设我们开发一个系统Android iOS Web统一后端Spring Boot要求用户登录Token认证自动续签强制下线单设备登录整体流程登录 ↓ JWT ↓ 访问接口 ↓ JWT校验 ↓ Redis校验 ↓ 业务接口二、项目结构设计企业项目一般会拆security ├── JwtUtil ├── JwtAuthenticationFilter ├── SecurityConfig ├── LoginService ├── RefreshTokenService └── SecurityUtils职责类作用JwtUtilJWT生成与解析JwtAuthenticationFilterJWT认证过滤器SecurityConfigSpring Security配置LoginService登录逻辑RefreshTokenService刷新TokenSecurityUtils获取当前用户三、登录接口实现登录接口PostMapping(/login) public LoginVO login( RequestBody LoginDTO dto) { }不要自己查数据库。企业里 直接交给AuthenticationManager处理。Authentication authentication authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( dto.getUsername(), dto.getPassword() ) );认证成功 拿到用户信息LoginUser loginUser (LoginUser) authentication.getPrincipal();四、生成 JWT创建工具类public class JwtUtil { public static String createToken( Long userId) { } }生成String accessToken JwtUtil.createToken(userId);JWT中一般放userId username role expire即可。不要放密码 手机号 身份证因为 JWT 只是编码。不是加密。五、生成 RefreshToken登录成功后同时生成String refreshToken UUID.randomUUID().toString();保存 RedisredisTemplate.opsForValue().set( refresh: userId, refreshToken, 7, TimeUnit.DAYS );返回客户端{ accessToken:xxx, refreshToken:yyy }六、JWT过滤器实现企业里几乎都会写public class JwtAuthenticationFilter extends OncePerRequestFilter为什么因为OncePerRequestFilter保证一次请求只执行一次读取 TokenString token request.getHeader( Authorization);校验 JWTif(jwtUtil.validate(token)){ }七、创建 AuthenticationJWT验证成功后创建UsernamePasswordAuthenticationToken例如UsernamePasswordAuthenticationToken auth new UsernamePasswordAuthenticationToken( loginUser, null, loginUser.getAuthorities() );放入SecurityContextHolderSecurityContextHolder .getContext() .setAuthentication(auth);此时 Controller里面 就能获取当前用户。八、获取当前用户企业项目都会封装public class SecurityUtils例如public static Long getUserId() { Authentication auth SecurityContextHolder .getContext() .getAuthentication(); }Controller直接Long userId SecurityUtils.getUserId();即可。九、Redis会话校验很多教程到 JWT 就结束了。但企业项目通常还要查 Redis例如JWT解析出来userId 1001检查login:user:1001是否存在。不存在直接401这样才能实现强制下线 账号冻结 风险控制十、实现强制下线管理员点击踢下线删除redisTemplate.delete( login:user:1001 );此时JWT仍然没过期。但Redis检查失败。直接401 Unauthorized实现立即下线十一、实现单设备登录用户手机A登录。Redislogin:user:1001随后手机B登录。覆盖login:user:1001此时手机AJWT还在。但Redis中的登录标识变了。下一次请求401实现单设备登录十二、RefreshToken续签AccessToken30分钟RefreshToken7天接口返回401客户端自动调用POST /refresh校验refreshToken成功生成newAccessToken返回。客户端重放请求。用户无感知十三、企业项目中的真实流程用户登录 │ ▼ AuthenticationManager │ ▼ 生成JWT │ ▼ 生成RefreshToken │ ▼ Redis保存 │ ▼ 返回客户端接口访问客户端 │ Bearer Token ▼ JwtFilter │ JWT校验 ▼ Redis校验 │ Authentication ▼ SecurityContextHolder │ Controller ▼ Service面试高频问题Spring Security核心是什么Filter ChainJwtFilter为什么继承OncePerRequestFilter保证一次请求只执行一次Authentication是什么当前认证用户SecurityContextHolder是什么当前线程用户上下文为什么JWT还要RedisJWT负责认证 Redis负责会话控制企业为什么不用纯JWT无法踢下线 无法主动失效 无法单设备登录最终核心理解到这里你已经把JWT ↓ Redis ↓ Spring Security ↓ 认证体系真正串起来了。企业里的认证方案本质上是Spring Security 提供认证框架JWT 提供身份认证Redis 提供会话生命周期管理三者协同共同完成企业级登录认证系统下篇预告下一篇我们继续《企业认证与安全体系六Gateway 为什么能统一鉴权一篇讲透微服务认证体系》深入讲透为什么微服务必须有网关Gateway 如何统一鉴权JWT 为什么适合网关用户信息如何在服务间传递Gateway JWT Redis 企业架构真正进入微服务认证体系。