企业认证与安全体系(五):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 企业架构

真正进入:

微服务认证体系。

相关推荐
用户3169353811832 天前
Java连接Redis
redis
Aphasia3112 天前
VPN 与内网穿透
安全
Mr_愚人派3 天前
当"Claude"不再是 Claude:一次第三方 API 代理引发的 AI 身份伪造排查实录
人工智能·安全
码云数智-园园4 天前
C++20 Modules 模块详解
java·开发语言·spring
DaLi Yao4 天前
【无标题】
人工智能·安全
咖啡八杯4 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
Flittly4 天前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
李少兄4 天前
从原理到实战:Spring IoC/DI 核心知识体系与高频面试题全解
java·后端·spring