企业认证与安全体系(五):Spring Security + JWT + Redis 企业级认证实战

上一篇我们已经把企业认证体系的全景图串起来了。

我们知道:

复制代码
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

职责:

作用
JwtUtil JWT生成与解析
JwtAuthenticationFilter JWT认证过滤器
SecurityConfig Spring Security配置
LoginService 登录逻辑
RefreshTokenService 刷新Token
SecurityUtils 获取当前用户

三、登录接口实现

登录接口:

复制代码
@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();

保存 Redis:

复制代码
redisTemplate.opsForValue().set(
        "refresh:" + userId,
        refreshToken,
        7,
        TimeUnit.DAYS
);

返回客户端:

复制代码
{
  "accessToken":"xxx",
  "refreshToken":"yyy"
}

六、JWT过滤器实现

企业里:

几乎都会写:

复制代码
public class JwtAuthenticationFilter
        extends OncePerRequestFilter

为什么?

因为:

复制代码
OncePerRequestFilter

保证:

复制代码
一次请求只执行一次

读取 Token:

复制代码
String token =
        request.getHeader(
            "Authorization");

校验 JWT:

复制代码
if(jwtUtil.validate(token)){
    
}

七、创建 Authentication

JWT验证成功后:

创建:

复制代码
UsernamePasswordAuthenticationToken

例如:

复制代码
UsernamePasswordAuthenticationToken auth =
    new UsernamePasswordAuthenticationToken(
        loginUser,
        null,
        loginUser.getAuthorities()
    );

放入:

复制代码
SecurityContextHolder

SecurityContextHolder
        .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登录。

Redis:

复制代码
login:user:1001

随后:

手机B登录。

覆盖:

复制代码
login:user:1001

此时:

手机A:

JWT还在。


但:

Redis中的登录标识变了。


下一次请求:

复制代码
401

实现:

单设备登录


十二、RefreshToken续签

AccessToken:

复制代码
30分钟

RefreshToken:

复制代码
7天

接口返回:

复制代码
401

客户端:

自动调用:

复制代码
POST /refresh

校验:

复制代码
refreshToken

成功:

生成:

复制代码
newAccessToken

返回。


客户端:

重放请求。


用户:

复制代码
无感知

十三、企业项目中的真实流程

复制代码
用户登录
    │
    ▼
AuthenticationManager
    │
    ▼
生成JWT
    │
    ▼
生成RefreshToken
    │
    ▼
Redis保存
    │
    ▼
返回客户端

接口访问:

复制代码
客户端
   │
Bearer Token
   ▼
JwtFilter
   │
JWT校验
   ▼
Redis校验
   │
Authentication
   ▼
SecurityContextHolder
   │
Controller
   ▼
Service

面试高频问题

Spring Security核心是什么?

复制代码
Filter Chain

JwtFilter为什么继承OncePerRequestFilter?

复制代码
保证一次请求只执行一次

Authentication是什么?

复制代码
当前认证用户

SecurityContextHolder是什么?

复制代码
当前线程用户上下文

为什么JWT还要Redis?

复制代码
JWT负责认证

Redis负责会话控制

企业为什么不用纯JWT?

复制代码
无法踢下线
无法主动失效
无法单设备登录

最终核心理解

到这里,

你已经把:

复制代码
JWT
↓
Redis
↓
Spring Security
↓
认证体系

真正串起来了。

企业里的认证方案,

本质上是:

  1. Spring Security 提供认证框架
  2. JWT 提供身份认证
  3. Redis 提供会话生命周期管理

三者协同,共同完成:

企业级登录认证系统


下篇预告

下一篇我们继续:

《企业认证与安全体系(六):Gateway 为什么能统一鉴权?一篇讲透微服务认证体系》

深入讲透:

  • 为什么微服务必须有网关
  • Gateway 如何统一鉴权
  • JWT 为什么适合网关
  • 用户信息如何在服务间传递
  • Gateway + JWT + Redis 企业架构

真正进入:

微服务认证体系。

相关推荐
x-cmd1 小时前
[260531] OpenClaw 五月月报:模型接入大爆发、安全重构、手机端终于能当主控台用了 [特殊字符]
安全·ai·智能手机·重构·x-cmd·openclaw
国科安芯1 小时前
ASM232S电气特性与TIA/EIA-232-F及ITU V.28标准符合性深度分析
单片机·嵌入式硬件·算法·安全·架构
Rain5091 小时前
mini-cc 权限安全:给 AI 戴上枷锁
前端·人工智能·安全·架构·node.js·ai编程
会编程的土豆1 小时前
Redis 常用操作笔记(Go 开发实战)
redis·笔记·golang
JP-Destiny1 小时前
docker-安装redis
java·redis·docker
轻刀快马1 小时前
重塑 Java 世界的两根支柱:穿透 Spring IoC 与 AOP 的架构哲学
java·spring·架构
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【68】Graph SSE 流式输出
java·人工智能·spring
小杍随笔1 小时前
【Rust后端缓存设计实战:从本地moka到Redis多层架构的避坑指南】
redis·缓存·rust
ylscode1 小时前
微软发布针对 Windows 11 的 KB5089573 补丁,以修复“周二补丁日”安装问题
windows·安全·microsoft·安全威胁分析