Spring Boot 、Spring Cloud 微服务架构认证授权方案

目录

前言

Spring Boot 或者 Spring Cloud 微服务架构中最常见的认证授权场景

需求场景:

  1. 用户登录后颁发 Token
  2. 所有微服务校验 Token
  3. Token 过期自动续签
  4. 微服务之间调用传递用户身份

目前主流方案有:

方案 推荐度 适用场景
JWT + Spring Security ★★★★★ 最常见
OAuth2 + Spring Authorization Server ★★★★★ 企业级标准方案
Sa-Token ★★★★★ 国内项目非常流行
Apache Shiro ★★ 老项目较多
Session共享(Redis) ★★ 单体项目较多

对于 Spring Cloud 项目,现在最主流的是:

Spring Security + JWT + Gateway

或者

Spring Authorization Server + OAuth2 + JWT


方案一:JWT + Spring Security(最常用)

架构:

text 复制代码
                登录

          +-------------+
          | auth-service |
          +-------------+
                 |
                 | 生成JWT
                 ▼

      eyJhbGciOiJIUzI1NiJ9...

                 |
                 ▼

        浏览器/APP保存Token

                 |
                 ▼

            Gateway

                 |
                 ▼

   user-service order-service

1.登录

用户登录:

http 复制代码
POST /login

{
   "username":"admin",
   "password":"123456"
}

认证成功:

json 复制代码
{
  "token":"xxxxx.yyyyy.zzzzz"
}

JWT内容:

json 复制代码
{
  "userId":1001,
  "username":"admin",
  "role":"ADMIN",
  "exp":1750000000
}

2.请求

http 复制代码
GET /user/info

Authorization: Bearer xxxxx.yyyyy.zzzzz

3.Gateway统一校验

不要每个微服务都校验。

一般放在 Gateway。

text 复制代码
用户
  ↓
Gateway
  ↓
UserService
  ↓
OrderService

流程:

text 复制代码
请求
 ↓
Gateway
 ↓
解析JWT
 ↓
验证签名
 ↓
验证过期时间
 ↓
放行

失败:

json 复制代码
{
  "code":401,
  "msg":"token已失效"
}

4.Gateway过滤器

例如:

java 复制代码
@Component
public class JwtFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(
            ServerWebExchange exchange,
            GatewayFilterChain chain) {

        String token = exchange
                .getRequest()
                .getHeaders()
                .getFirst(HttpHeaders.AUTHORIZATION);

        if(token == null){
            throw new RuntimeException("未登录");
        }

        JwtUtil.parse(token);

        return chain.filter(exchange);
    }
}

这样所有微服务自动生效。


5.微服务是否还要校验?

有两种做法。

做法1

只在Gateway校验

text 复制代码
用户
 ↓
Gateway
 ↓
UserService

优点:

性能高

缺点:

绕过Gateway直接访问服务有风险


做法2(推荐)

Gateway校验一次

微服务再校验一次

text 复制代码
用户
 ↓
Gateway
 ↓
UserService
 ↓
再次校验JWT

银行、证券、支付系统通常这样做。

你在证券行业,建议采用这种模式。


6.Token过期怎么办

JWT天然有过期时间:

java 复制代码
Jwts.builder()
    .setExpiration(
        new Date(System.currentTimeMillis()+3600_000)
    )

例如:

text 复制代码
1小时过期

问题来了

用户操作到59分钟时:

text 复制代码
突然过期

体验很差。

所以需要:

text 复制代码
Access Token + Refresh Token

7.Access Token + Refresh Token

登录:

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

Access Token

有效期:

text 复制代码
30分钟

Refresh Token

有效期:

text 复制代码
7天

流程:

text 复制代码
用户请求
      ↓
Access Token过期
      ↓
401
      ↓
前端调用

/auth/refresh

      ↓
携带Refresh Token
      ↓
认证中心
      ↓
签发新的Access Token

用户无感知。


方案二:OAuth2 标准方案

大厂一般:

text 复制代码
Authorization Server
+
Resource Server

Spring 官方方案:

  • Spring Security
  • Spring Authorization Server

架构:

text 复制代码
          +------------------+
          | Authorization    |
          | Server           |
          +------------------+

                 |
          签发JWT
                 |

 +---------+ +---------+
 | UserSvc | |OrderSvc |
 +---------+ +---------+

认证中心负责:

text 复制代码
登录
签发Token
刷新Token
注销Token

业务系统负责:

text 复制代码
校验Token
读取用户信息

职责非常清晰。


方案三:国内项目常用:Sa-Token

如果你不想写一堆 Spring Security 配置。

推荐:

Sa-Token 官方网站

特点:

text 复制代码
比Spring Security简单
支持JWT
支持Redis
支持单点登录
支持权限控制
支持踢人下线
支持Token续签

登录:

java 复制代码
StpUtil.login(userId);

获取Token:

java 复制代码
String token = StpUtil.getTokenValue();

校验:

java 复制代码
StpUtil.checkLogin();

非常简单。

很多国内中后台项目都在使用。


方案四:证券行业推荐架构

如果目前的技术栈是Spring Boot + Spring Cloud:

text 复制代码
                Gateway
                    │
                    ▼
            auth-service
                    │
     ┌──────────────┼──────────────┐
     ▼              ▼              ▼

 user-service  order-service  trade-service

                    │
                    ▼
                 Redis

认证方案:

text 复制代码
Spring Security
+ JWT
+ Redis
+ Gateway

Token设计:

text 复制代码
Access Token
30分钟

Refresh Token
7天

流程:

text 复制代码
登录
 ↓
auth-service签发Token
 ↓
Gateway校验
 ↓
微服务二次校验
 ↓
过期
 ↓
Refresh Token换新Token

这是目前绝大多数金融、证券、银行类 Spring Cloud 系统采用的模式。


其他建议深入理解的:

  • Spring Security 认证流程
  • JWT 的组成与签名原理
  • OAuth2 四种授权模式
  • Spring Authorization Server
  • Gateway 统一鉴权
  • Refresh Token 续签机制
  • 单点登录(SSO)
  • Redis 黑名单 Token
  • 用户强制下线实现原理
相关推荐
mCell6 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
记忆停留w7 小时前
从单体到微服务:Redis 协同 MySQL、Milvus、MinIO 搭建企业级RAG/AI Agent脚手架架构
大数据·人工智能·redis·微服务·ai·架构·milvus
财财源源7 小时前
.NET 程序保护实战系列01-流水线架构与保护引擎总览
架构·.net
KaMeidebaby7 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
深圳恒讯8 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
龙亘川9 小时前
开源本地 AI 智能体网关 OpenClaw 深度实践:架构解析、全场景部署与自动化落地指南
人工智能·架构·开源·openclaw
数智化转型推荐官10 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
ZhengEnCi11 小时前
S02-SpringBoot实体类新增字段对已有数据的影响及自动DDL同步机制详解
数据库·spring boot
Sirius Wu11 小时前
OpenClaw(UpClaw)三层Tool全链路治理深度详解
网络·人工智能·架构·aigc
程序员张312 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端