3、用户认证与鉴权应该放在哪里进行?

用户服务—基于JWT的Token认证实现登录、鉴权接口 目录 用户服务—基于JWT的Token认证实现登录、鉴权接口 基于session身份认证方案 基于token身份认证方案 JWT介绍 pom.xml JwtHelper 登录、鉴权 获取用户信息 用户服务—基于JWT的Token认证实现登录、鉴权接口 基于session身份认证方案 基于token身份认证方案 JWT介绍 ... 阅读详情

这是一个非常关键、且在真实企业级 Spring Cloud 微服务电商项目中必须精准设计的核心问题:

用户认证(Authentication)与鉴权(Authorization)应该放在哪里?推荐在哪里处理?实际项目中是怎么做的?


✅ 一句话结论(先看结果)

在 Spring Cloud 微服务电商系统中:

🔹 认证(Authentication) → 放在 API 网关(Gateway)或独立的 Auth Service
🔹 鉴权(Authorization) → 放在 每个业务微服务内部
🔹 最佳实践组合:
👉 网关做“初步认证 + JWT 校验”
👉 各服务做“细粒度权限校验”
👉 统一使用 OAuth2 / JWT + RBAC 权限模型
👉 所有请求携带 Token,不依赖 Session


🧩 一、基本概念区分

概念含义举个例子
Authentication(认证)“你是谁?”
验证身份是否合法
用户输入账号密码 → 系统确认是张三
Authorization(鉴权)“你能做什么?”
验证权限是否足够
张三能查看订单,但不能删除商品

💡 认证是“进门”,鉴权是“进哪个房间”。


🏗️ 二、推荐架构设计(Spring Cloud 微服务电商标准方案)

✅ 推荐架构图(文字版)

[客户端] 
   ↓ (携带 JWT Token)
[API Gateway - urbane-commerce-gateway]
   ↓ 验证 Token 是否有效、过期、签名
   ↓ 提取用户ID、角色、权限 → 注入到 Request Header (如 X-User-ID, X-Permissions)
   ↓ 放行给后端服务
[product-service] → 检查:当前用户是否有 "READ_PRODUCT" 权限?
[order-service]   → 检查:当前用户是否是该订单的所有者?
[cart-service]    → 检查:是否为登录用户操作自己的购物车?
[auth-service]    ← 独立服务:负责登录、刷新Token、密码管理

✅ 核心原则:网关做“守门人”,服务做“裁判员”


📍 三、具体组件职责划分(实战落地)

组件职责技术实现是否推荐
API Gateway(网关)✅ 认证中心
- 验证 JWT 签名
- 检查 Token 是否过期
- 解析 payload 中的 user_id, roles
- 将用户信息注入 HTTP Header(如 X-User-ID, X-Roles)
- 拦截未授权访问(401)
Spring Cloud Gateway + JwtDecoder + Filter✅✅✅ 强烈推荐
Auth Service(独立认证服务)✅ 唯一登录入口
- 处理 /login、/refresh-token
- 校验用户名密码
- 生成 JWT(含用户 ID、角色、权限)
- 可对接 LDAP/SSO/第三方登录(微信、Google)
Spring Boot + Spring Security + JWT + Redis(存黑名单)✅✅✅ 强烈推荐
业务微服务(如 order-service)✅ 鉴权中心
- 从 Header 获取用户信息
- 校验当前操作是否拥有对应权限(如:canDeleteOrder)
- 检查“所有权”(如:你只能操作自己的订单)
- 使用 @PreAuthorize("hasAuthority('DELETE_ORDER')")
Spring Security + 方法级注解 / 自定义拦截器✅✅✅ 必须做
数据库 / 权限表存储权限关系users, roles, permissions, user_roles, role_permissions✅✅✅ 必须有
Redis缓存 Token 黑名单(退出登录)、限流存放已注销的 JWT token(key: jwt:blacklist:xxx)✅✅ 推荐

⚠️ 不推荐:把所有鉴权逻辑都丢给网关 —— 它无法知道“这个订单是不是你的”


🔍 四、为什么这样设计?—— 实战中的思考

问题为什么不放在网关全管?为什么不只在服务里做?
Q1:网关怎么知道“这个订单属于当前用户”?❌ 网关不知道业务语义!它只知道“Token 有效”。订单归属是业务逻辑,只有 order-service 懂。✅ 服务自己查 DB:SELECT * FROM orders WHERE user_id = ? AND id = ?
Q2:用户退出登录,如何立即失效 Token?✅ 网关可检查 Redis 黑名单(轻量)✅ 服务无需感知,只需信任 Header
Q3:权限变更(如管理员提升)如何生效?❌ 如果只靠 JWT,需等过期才更新✅ 服务可缓存权限,结合 Redis 刷新(TTL 5min)
Q4:性能影响?✅ 网关校验 JWT 是内存计算,极快✅ 服务鉴权用缓存,不会每次都查库
Q5:微服务独立部署?✅ 每个服务都能独立运行,只要传 Header 即可✅ 不依赖网关存在

✅ 结论:网关是“安检口”,服务是“包间保安”
—— 两者分工明确,缺一不可。


🛠️ 五、真实项目中的典型实现(大厂/中型团队做法)

✅ 1. 认证流程(登录)

sequenceDiagram
    participant Client
    participant Gateway
    participant Auth-Service
    participant DB

    Client->>Auth-Service: POST /auth/login {username, password}
    Auth-Service->>DB: 查询用户密码,比对
    DB-->>Auth-Service: 返回用户信息
    Auth-Service->>Auth-Service: 生成 JWT(含 user_id, roles, permissions)
    Auth-Service->>Client: 返回 {token: "eyJ...", expires_in: 3600}

✅ 2. 请求流程(带 Token 访问订单)

sequenceDiagram
    participant Client
    participant Gateway
    participant Order-Service
    participant Redis

    Client->>Gateway: GET /orders/123 Authorization: Bearer <JWT>
    Gateway->>Gateway: 解析 JWT,验证签名 & 过期时间
    Gateway->>Redis: 检查 token 是否在黑名单(退出登录)
    Gateway->>Order-Service: Forward 请求 + Header: X-User-ID=5, X-Roles=admin,user
    Order-Service->>Order-Service: @PreAuthorize("hasAuthority('READ_ORDER') and #orderId == principal.userId")
    Order-Service->>DB: SELECT * FROM orders WHERE id=123 AND user_id=5
    DB-->>Order-Service: 返回订单
    Order-Service-->>Gateway: 200 OK
    Gateway-->>Client: 200 OK

✅ 3. 权限模型(RBAC + 资源所有者)

表结构示例
users(id, username, password_hash)
roles(id, name: ‘USER’, ‘ADMIN’, ‘MODERATOR’)
permissions(id, code: ‘READ_PRODUCT’, ‘DELETE_ORDER’, ‘UPDATE_STOCK’)
user_roles(user_id, role_id)
role_permissions(role_id, permission_id)

🔐 在 order-service 中:

@PreAuthorize("hasAuthority('READ_ORDER') and #orderId == authentication.principal.userId")
@GetMapping("/{orderId}")
public Order getOrder(@PathVariable Long orderId) {
    return orderService.findById(orderId);
}

✅ 这样既保证了角色权限,也保证了数据所有权!


💡 六、进阶优化建议(真实项目必备)

优化点实现方式效果
JWT 缓存权限将用户权限缓存到 Redis(Key: user:perms:5),Token 中只存 userId减少每次鉴权查库,支持动态权限更新
权限刷新机制当管理员修改用户权限时,清除 Redis 中该用户的权限缓存实时生效,无需重新登录
跨服务权限调用使用 Feign + 拦截器传递 X-User-ID 和 X-Permissions内部服务调用也能继承身份
日志追踪在网关和所有服务中记录 X-Request-ID + X-User-ID便于审计和排查问题
OpenTelemetry 集成为认证/鉴权链路打埋点监控鉴权耗时、失败率
多租户支持在 JWT 中增加 tenant_id,所有查询加 WHERE tenant_id = ?支持 SaaS 化

🚫 七、常见错误做法(避坑指南)

错误做法问题
所有鉴权都在网关做无法控制“谁可以删自己的订单”,只能控制“能不能访问订单接口”→ 安全漏洞
使用 Session + Cookie微服务无状态架构被破坏,无法横向扩展,集群部署困难
JWT 中塞太多数据Token 过大,网络传输成本高,可能超过 header 限制
不校验 Token 过期导致长期有效的 Token 泄露后风险极高
不做黑白名单用户登出后仍可继续使用旧 Token
服务之间直接调用不传身份A 服务调 B 服务时冒充用户 → 权限绕过

📦 八、代码结构建议(Spring Boot 项目结构)

urbane-commerce/
├── services/
│   ├── auth-service/             ← 唯一认证中心
│   │   ├── controller/AuthController.java
│   │   ├── service/JwtService.java
│   │   └── config/SecurityConfig.java
│   │
│   ├── order-service/            ← 业务服务
│   │   ├── controller/OrderController.java
│   │   ├── service/OrderService.java
│   │   ├── config/WebSecurityConfig.java   ← 开启方法级权限
│   │   └── aspect/PermissionAspect.java    ← 自定义权限切面(可选)
│   │
│   └── urbane-commerce-gateway/  ← API 网关
│       ├── filter/JwtAuthenticationFilter.java  ← 核心!校验并注入Header
│       ├── config/GatewayConfig.java
│       └── security/JwtUtil.java
│
└── commons/
    └── urbane-commons/
        └── model/UserContext.java          ← 存储当前用户信息(ThreadLocal)
        └── interceptor/UserInterceptor.java ← 从Header提取用户信息到 ThreadLocal

💡 UserContext 工具类(线程安全):

public class UserContext {
    private static final ThreadLocal<UserInfo> context = new ThreadLocal<>();

    public static void setUser(UserInfo user) { context.set(user); }
    public static UserInfo getUser() { return context.get(); }
    public static void clear() { context.remove(); }
}

在网关过滤器中设置,在业务服务中读取:

// 在 OrderController 中
UserInfo currentUser = UserContext.getUser();
if (!currentUser.getId().equals(order.getUserId())) {
    throw new UnauthorizedException("你无权访问此订单");
}

✅ 总结:终极答案(面试/汇报可用)

在真实的 Spring Cloud 微服务电商项目中:

  1. 认证(Authentication)由独立的 auth-service 处理,网关负责校验 JWT 是否合法;
  2. 鉴权(Authorization)由每个业务服务自行完成,基于角色 + 数据所有权双重校验;
  3. 所有服务通过 HTTP Header(如 X-User-ID)传递用户身份,无状态、可扩展;
  4. 使用 JWT + RBAC + Redis 黑名单 + 方法级注解(@PreAuthorize)构建完整安全体系;
  5. 严禁使用 Session,禁止将业务权限判断交给网关。

🔒 安全底线:永远不要相信客户端传来的任何信息,即使它带着 Token。


如果你需要我为你提供一份 完整的可运行 Demo 项目结构(含 GitHub 风格代码模板),包括:

  • auth-service 登录接口
  • gateway 的 JWT 过滤器
  • order-service 的 @PreAuthorize 示例
  • UserContext 工具类

我可以为你打包成一个 ZIP 或 Git 仓库结构,直接复制到你的项目中使用 👇

只需告诉我:“请给我完整代码模板!” 我立刻发你 🚀

doris:认证与鉴权概述 阅读详情

相关推荐

GaussDB认证鉴权

调用接口有如下两种认证方式,您可以选择其中一种进行认证鉴权。

m0_60569209的博客 965

搭建微服务下统一认证授权服务,鉴权客户端大致流程(基于无状态)

1.简介 基于无状态令牌(jwt)的认证方案,服务端无需保存用户登陆状态 基于spring security框架 + oauth2协议 搭建 基于spring cloud nacos,服务调用使用RestTemplate 前置知识: jwt (也就是这里用到的token) 就是一大串加密的字符串,用户的登陆状态都保存在里面,但这种字符串里面的数据不能被修改,一但修改校验一定会出错....

BurukeYou 7186

SIP 鉴权 & HTTP 认证

sip 鉴权是基于摘要签名认证的,具体来说: 每一个用户都有一个用户名和密码,用户名和密码在客户端和SIP 服务器的数据库中都有保存。 在认证的过程中, 客户端将自己的信息(用户名 密码 url 等信息) 做一些复杂的MD5 或者SHA256/SHA512 签名,这个签名给SIP server, SIP server 也会用相同的信息计算签名, 结果一样就认为发送消息的用户是真正合法的用户。 ...

lyyslsw的专栏 2350

终极指南:如何在Oak中实现用户认证和授权(JWT、OAuth2.0完整教程)

Oak作为Deno生态中最受欢迎的中间件框架,为开发者提供了构建安全可靠HTTP服务的强大工具。本教程将带你掌握在Oak应用中实现用户认证与授权的核心技术,包括JWT令牌验证和OAuth2.0集成,让你的Web应用具备企业级安全防护能力。 ## 为什么选择Oak进行认证开发? Oak基于Deno的原生HTTP模块构建,提供了轻量级但功能完备的中间件系统。其异步非阻塞的处理模式和TypeScri

gitblog_00222的博客 1110

统一认证+多租户体系+鉴权

统一认证+多租户体系+鉴权

RK3588嵌入式AI部署实战:从环境搭建到模型推理全链路

嵌入式AI部署涉及交叉编译、NPU驱动、模型量化与运行时环境等多个技术环节,其核心挑战在于软硬件版本矩阵的严格匹配。在边缘计算场景中,RK3588凭借6TOPS NPU算力成为热门平台,但环境搭建与模型转换的复杂性常导致部署效率低下。通过容器化工具链管理、量化参数对齐及多线程推理优化,可显著提升部署稳定性与推理性能。典型应用包括智能安防、工业质检与视频结构化分析。本文围绕RK3588的AI部署与环境搭建,系统梳理从系统烧录到板端推理的完整实践路径。

weixin_42520573的博客 282

微服务网关实战:从路由配置到统一鉴权,一篇搞定 SpringCloudGateway 核心用法

本文主要说明gateway和nacos

少年你真的要止步于此嘛。 1173

海波龙(Oracle Hyperion)单点登陆问题记录

Oracle海波龙套件已经多年未更新,按Oracle官方文档实施单点登陆启用之后,SmartView工具通过专用链接方式无法登陆系统。 在抓包逆向分析之后 定位到HspSmartViewServlet类在执行以下代码时获得的ssotoken无效导致,在某大厂工作的时候曾通过在filter中截获请求的方式植入Attribute,保留账号密码并在单点程序中处理实现登陆。 但在完美世界的环境中...

cainiaoEzu的专栏 1970

这才是 SpringBoot 统一登录鉴权、异常处理、数据格式 的正确姿势

本篇将要学习 Spring Boot 统一功能处理模块,这也是 AOP 的实战环节用户登录权限的校验实现接口异常处理使用注解数据格式返回使用注解并且实现接口。

zhangjiaming_zjm的博客 1408

从零构建智慧农业监测终端:STM32数据采集与LoRa组网实战

本文详细介绍了如何从零构建智慧农业监测终端,涵盖STM32数据采集与LoRa组网实战。通过DHT22温湿度传感器和YL-69土壤湿度传感器实现精准环境监测,结合LoRa无线传输技术解决偏远农田信号问题。文章还分享了硬件选型、电路设计、低功耗优化及Flutter跨平台应用开发等关键技巧,助力农业智能化升级。

weixin_29172963的博客 357

从专利库到Zemax:一个6mm定焦镜头从零到交付的完整设计流程(含CodeV转换技巧)

本文详细介绍了6mm定焦镜头从专利库检索到最终交付的全流程设计,重点解析了CodeV与Zemax工具链的无缝衔接技巧。通过实际案例展示规格定义、专利筛选、结构适配、非球面优化等关键步骤,帮助光学设计工程师提升设计效率和制造良率。特别包含CodeV转换Zemax的实用技巧,适用于机器视觉和安防镜头开发。

weixin_42561040的博客 160

如何建设统一业务访问认证服务能力

随着集团统一身份管理系统能力建设,IAM平台适配多维数字组织,纳入各机构不同业务应用,用户认证需求差异化增大

trusfort的博客 1213

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

SpringCloud认证和鉴权的6种方案

认证和鉴权 SpringCloud认证和鉴权方案 开始我们接触的时候权限认证 无从下手,但是当接触之后会发现 权限认证时一件很简单的事情,但是我们 方案众多又该如何选择呢,下面会分别对每种方案进行简单的阐述,有问题或者不明白的可以私信或者下方留言,一起讨论 含义 认证:简单来说,认证这个用户是谁。 鉴权:简单来说,就是了解这个用户能做什么事情 本篇章介绍如下几种方式 1.单体应用...

十年呵护的专栏 4万+

国产麒麟系统中的PaddleOCR离线绿色部署:高效安全的文字识别新纪元

摘要:本文详细介绍了PaddleOCR在银河麒麟V10SP1系统上的离线部署方案。通过Conda虚拟环境隔离依赖,采用离线包安装方式实现无网络部署,支持80+语言识别。重点讲解了模型量化剪枝优化、多线程处理等性能调优技巧,并提供了完整的OCR识别代码示例。该方案具有数据本地化处理的安全优势,适用于医疗票据数字化等对隐私要求严格的场景,同时解决了模型加载失败、内存不足等常见问题。

墨夶的博客 1227

飞腾UEFI配置GPIO—飞腾FT2000/4 (D2000/8) GPIO引脚配置及使用

讲解了在飞腾UEFI代码中如何添加GPIO配置相关代码,并以GPIO1_B0—B7为例,将这8个引脚配置为GPIO工作模式并默认输出低电平

qq_30135687的博客 5343

onvif应用--IPC鉴权(认证)

本文介绍了onvif中IPC客户端开发中的鉴权(认证)的原理、如何实现鉴权、利用ONVIF Device Test Tool进行测试及其涉及的相关函数

janet110617的博客 3259

通过理解 sk_buff 深入掌握 Linux 内核自定义协议族的开发实现

在。

数字人生 457

API 安全之认证鉴权

API 作为企业的重要数字资源,在给企业带来巨大便利的同时也带来了新的安全问题,一旦被攻击可能导致数据泄漏重大安全问题,从而给企业的业务发展带来极大的安全风险。

阿里巴巴云原生的博客 1395

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Apache Kafka 中的认证、鉴权原理与应用

本文概述了 Kafka 中的认证协议和鉴权策略。首先介绍了 listener 与安全协议的映射,以及安全协议与认证方法的映射。接着分别介绍 Kafka 中支持的多种认证协议,以及 ACL 鉴权策略。在认证通过后,Kafka 会生成一个认证主体,供上层进行细粒度的鉴权。最后介绍了如何对一个运行中的 Kafka 集群中进行认证协议升级以及开启鉴权。

AutoMQ的博客 1435

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

产品背景知识:鉴权与认证

认证(Authentication)和鉴权(Authorization)是安全体系中两大核心机制。认证用于验证用户身份(如密码、指纹),确保“你是谁”;鉴权则决定用户权限(如角色权限分配),控制“你能做什么”。两者需协同工作,先认证后鉴权才能构建完整访问控制。常见技术包括多因素认证(MFA)、RBAC权限模型等。若缺少认证,系统无法识别身份;缺少鉴权则可能导致越权操作。最佳实践是将两者逻辑分离,并遵循最小权限原则,以提升整体安全性。

woshihlf的博客 912

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AFN中的鉴权

1. AFN 概览 作为 iOS 上最知名且最广泛使用的网络库,AFN 到底做了什么? 主要流程: 发起请求; 请求序列化; 安全策略应用; 响应序列化; 返回请求; 使用: 继承 AFHTTPSessionManager,创建自定义的请求对象; 设置安全策略; 发送 post、get 请求; 回调中处理结果; 类结构和请求流程 本文主要研究 AFN 的鉴权流程; 2. 鉴权...

康小曹(简书) 1万+

浅谈认证和鉴权

认证与鉴权

weixin_51955084的博客 2958

鉴权与身份认证

鉴权与身份认证、常用的鉴权方式和原理

ZXT02的博客 2335

登录认证和鉴权

登录认证的应用场景很广泛,例如用户登录微信之后才能发起聊天,看朋友圈;登录支付宝之后才能进行支付等等。这些场景涉及用户权限,所以系统要知道当前用户是谁,以及用户有没有操作权限,那么具体怎么实现呢?

weixin_39805244的博客 2092

Springboot整合SpringSecurity实现登录认证和鉴权

springboot整合springsecurity实现用户登录认证和鉴权

weixin_44068320的博客 1万+
上一篇: 2、网关统一认证 + 服务内部鉴权
下一篇: 4、除了常见的 services(业务微服务)和 gateway(API 网关)模块外,还必须建立一系列支撑性、平台级、基础设施类模块
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值