微服务Token鉴权设计的几种方案

开箱即用!看看人家的微服务权限解决方案,那叫一个优雅 前置知识 我们将采用Nacos作为注册中心,Gateway作为网关,使用Sa-Token提供的微服务权限解决方案,此方案是基于之前的解决方案改造的 应用架构 还是和之前方案差不多的思路,认证服务负责登录处理,网关负责登录认证和权限认证,其他API服务负责处理自己的业务逻辑。为了能在多个服务中共享Sa-Token的Session,所有服务都需要集成Sa-Token和Redis。 micro-sa-token-common:通用工具包,其他服务公用的用户类UserDTO和通用返回结果类Commo 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

9fdf7d7ba570326295ea0f212b754772.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7329352197837029385


Token透传(不推荐)

刚开始接触微服务时网上给的方案大都数是通过透传Token做鉴权,但我认为这种方式不是很妥当。接着往下看:

f70a27309dab6b77237caf97c162bae7.jpeg

这种方式通过透传Token使得各微服务都能获取到当前登录人信息,在代码编写上确实可能会方便,但我认为这不是一种很好的设计方式。

原因一:内部API与外部API混合在一起不太好区分。

原因二:内部调用的微服务API因该具备无状态性质,这样才能保证方法的原子性以提高代码复用率。

换句话说:B服务提供API时不因该关心当前是否为登录状态,登录状态应该由路由中的第一个服务校验维护,在调用后续服务时应该显示的传入相关参数。比如以下场景:

场景一:用户签到添加积分

场景二:后台管理员给用户手动添加积分

场景三:分布式调度批量增加用户积分

根据需求积分服务提供了一个给用户添加积分的API,如果你的API是通过获取的当前登录用户ID增加的积分,那么面对场景二时你需要重新编写一个给用户添加积分的API,因为当前登录的是后台管理员而不是用户(代码复用率较低)

不透传数据,显示的提供入参

39b29133985d8ff487d76edb96907bba.jpeg

路由到达的第一个服务已经对Token进行了解析认证并将userId显示的传递给了后续服务,后续服务不需要再对token进行解析认证。根据1.1的三个场景只需要提供一个入参包含userId的API,保证了函数的原子性提供代码复用率。

注意: 提供的API不能暴露给外网,我们需要在路径上做区分,避免外网非法访问内部API。我们可以订好内部调用API路径规则,如: /api/inside/\** 。在网关层拒绝内部调用API请求的访问。

统一授权

统一授权是指:将API鉴权集中在应用网关上

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

Fegin内部调用方式

Spring Cloud Gateway + Fegin内部调用,集中在Gateway上做统一认证鉴权,鉴权后在请求头中添加鉴权后的信息转发给后续服务,如:userId等。。。

5a719386c5891af092da8cc69207f0ea.jpeg

缺点:A服务调用B服务时,B服务需要写一个内部调用的Controller接口A服务才能通过Fegin调用到B服务,增加了代码量(这里的设计方案是内部调用与外部调用Controller是分开的)

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

Dubbo内部调用方式

Spring Cloud Gateway + Dubbo内部调用,集中在Gateway上做统一认证鉴权,鉴权后在请求头中添加鉴权后的信息转发给后续服务,如:userId等。。。

优点:与第一种相比不需要额外编写一个Controller接口,只有本地service与远程DubboService的区别,代码更简洁。

缺点:项目技术栈略微增加了复杂度。

8d614f73093eb488f8bfd220be1ce61b.jpeg

Spring Boot Web + Dubbo内部调用方式

这里的设计方案直接去掉了Gateway,直接使用了一个Spring Boot Web项目来代替Gateway。但需要注意的是应该将Web项目的容器换成Undertow,因为Tomcat是阻塞式的容器,不换也不是不行,但吞吐量可能会少一下,Undertow是非阻塞式的容器,可以与Gateway到达相同的效果。(非阻塞式:当请求为线程进入阻塞状态时,当前线程会被挂起,当前的计算资源会去做别的事情,当被挂起的线程收到响应时才会被继续执行,压榨CPU用更少的资源做更多的事情,但并不会提升性能)

因为去掉了Gateway我们需要将所有服务的Controller集成到Web应用,然后在这个Web应用上做统一认证授权。如果将所有代码写到Web应用中,这样可能不合适,我们可以选择每个服务创建一个Controller模块,Web网关服务只有一个启动类,通过依赖的方式集成所有服务的Controller。

优点:简化了项目结构,所有服务只有service代码。性能压测时不用考虑Gateway的线程池使用情况,业务服务只需要考虑Dubbo线程池的使用情况。

缺点:没办法通过配置中心动态调整路由。比如说增加了一个服务Gateway可以不重启通过配置中心增加路由配置即可。

657a3767d23194006af31830e996620d.jpeg
非统一授权

非统一授权:不在应用网关上集成鉴权,网关只有单一的路由转发业务。各位服务都有自己的鉴权方式,当然也可以通过jar包的方式统一各服务的鉴权方式。

常规模式

通过编写通用的鉴权模块,各服务集成该模块。该模块具备以下功能:

  1. JWT Token解析

  2. 权限校验拦截

  3. 缓存(本地缓存\Redis缓存)

这种模式更适合大型项目团队,可能各微服务都由一个项目组负责。各服务维护自己的权限规则(这里指的是权限规则数据,规则是统一的)

b0d06ed4216a330fd04a936468474d31.jpeg

该模式下由于应用网关比较轻量级,不再涉及复杂的鉴权流程,使得项目部署可以更灵活,当我们使用K8S部署项目时,我们可以将应用网关替换成K8S中的Ingress网关。

我们先看常规模式部署在K8S中完整的链路:

9a9a7206e6a054c404dafe1848a7cf5c.jpeg

当用户访问时会先到达K8S Ingress网关通过应用网关Service的负载均衡调用应用网关,应用网关需要通过注册中心获取服务注册列表,通过服务注册列表负载均衡到后续服务。

与K8S集成

我们再来看看将应用网关替换成K8S中的Ingress网关的完整链路:

f5d7f0a9e75eb47a7f586e10c80191c6.jpeg

这里不仅只是去掉了应用网关,同时我们通过K8S Service 负载均衡的能力去掉了注册中心。减少了我们部署微服务时还要额外搭建一套注册中心。同时减少了一层没必要的转发。至于K8S中的Service,大家可以理解成一个本地的host假域名,比如我们在K8S给商品创建一个Service,名称为:goods-svc。那么我们可以通过goods-svc直连。如:

  1. http://goods-svc:8080/api/goods/info/10001

  2. dubbo://goods-svc:20880

方案没有对错,选择适合自己的就是最好的。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

2a7747115d35d56e20b59172ca57894c.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

b0d5b6265875db31507eeddb71359597.png

b0f25b933d7e486664cf62320cf2eb55.png8e9c0998464f47d94ac8a50879348bac.pngd0960b1d87de206d977b09047b656723.png13f4dd498669ffc47e988b55dd651d9f.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微服务权限控制demo 微服务权限控制demo微服务权限控制demo微服务权限控制demo微服务权限控制demo 立即下载

相关推荐

域控制器迁移后NETLOGON共享丢失的修复指南

本文详细解析了在Windows域控制器迁移后NETLOGON共享丢失的故障现象与修复方法。通过使用Dcdiag工具诊断,定位注册表键值SysVolReady异常及SCRIPTS目录缺失等核心原因,并提供了修改注册表、创建目录、重启Netlogon服务等逐步修复指南,帮助管理员快速恢复域用户登录功能,确保业务连续性。

weixin_29245767的博客 89

微服务常见认证、鉴权方案

参考网上一些优秀开源项目和框架,谈谈常见的微服务认证、鉴权方案。内容有SecurityOauth2、单点登录cas、自定义拦截器开发、微服务间鉴权、令牌的存储方式、shiro由单体改动为微服务 微服务认证、鉴权的目标: 一次登录后,各微服务都能访问 可对各微服务进行角色、接口等粒度的鉴权 SecurityOauth2 可能是seurity框架提供了一个微服务鉴权的直接解决方式,导致网上资料大部分都是此类方案。 这个方案理解起来并不难。 首先,在登录时,利用oauth2协议的四种方式及自定义.

u014203449的博客 1万+

windows版kafka异常java.nio.file.FileSystemException另一个程序正在使用此文件,进程无法访问

环境 现象 原因 解决方法 参考

山水牧羊 3847

微服务权限解决方案,Cloud Gateway+Oauth2实现统一认证和鉴权

最近发现了一个很好的微服务权限解决方案,可以通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权。此方案为目前最新方案,仅支持Spring Boot 2.2.0、Spring Cloud Hoxton 以上版本,本文将详细介绍该方案的实现,希望对大家有所帮助! 前置知识 我们将采用Nacos作为注册中心,Gateway作为网关,使用nimbus-jose-jwtJWT库操作JWT令牌 应用架构 我们理想的解决方案应该是这样的,认证服务负责认证,网关负责校验认证和鉴权,其他API服务负.

一入Java深似海 2万+

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 855

揭秘 | 顶刊论文插图中的高级配色方案(附RGB/HEX码解析)

本文揭秘了顶级期刊如《Nature》《Science》插图的高级配色方案,详细解析了RGB/HEX码的应用技巧。从双色配色的黄金组合到复杂数据可视化的多色解决方案,提供了实用的配色法则和跨平台一致性建议,帮助科研人员提升图表专业度和视觉传达效果。

weixin_28523493的博客 989

八.SpringCloud+Security+Oauth2实现微服务授权 - 常见的微服务授权方案

系列文章目录 一.SpringSecurity基础-认证和授权概述 二.SpringSecurity基础-简单登录实现 三.SpringSecurity基础-认证原理&改造登录流程 四.SpringSecurity基础-授权流程 五.SpringSecurity基础-认证授权结果处理 六.SpringSecurity基础-记住我功能实现 前言 前面我们讨论的是SpringSecurity基础部分内容,接下来我们来探讨一下SpringCloud 集成 SpringSecurity和Oauth实现微

墨家巨子@俏如来 6439

服务器测试之网卡性能调优

nvidia下载mlnx_ofed:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/intel下载驱动固件:https://www.intel.com/content/www/us/en/download-center/home.html。然而,你可以根据实际情况手动调整中断相关配置。老生常谈了,一些性能相关的设置项打开,节能的关闭,虚拟化相关的VMX/SR-IOV/IOMMU最好也都关掉。

qq_41897488的博客 4911

学习笔记—微服务—技术栈实践(7)——微服务的权限方案

微服务架构记录8——技术栈实践。微服务的权限方案,Spring Security, OAuth2.0, Gateway, JPA, Redis

qq_34257208的博客 1556

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoint有诸多细节需要优化,特此整理成技术文档。本文档描述了实验pytorch-superpoint与pytorch-superglue项目训练自己的图像配准模型。

a486259的博客 9507

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 168

聊聊微服务Token鉴权设计的几种方案

但需要注意的是应该将Web项目的容器换成Undertow,因为Tomcat是阻塞式的容器,不换也不是不行,但吞吐量可能会少一下,Undertow是非阻塞式的容器,可以与Gateway到达相同的效果。根据需求积分服务提供了一个给用户添加积分的API,如果你的API是通过获取的当前登录用户ID增加的积分,那么面对场景二时你需要重新编写一个给用户添加积分的API,因为当前登录的是后台管理员而不是用户(代码复用率较低)。各位服务都有自己的鉴权方式,当然也可以通过jar包的方式统一各服务的鉴权方式。

m0_73735578的博客 1126

华为OD机试 - 项目规划 - 深度优先搜索dfs(Java 2024 C卷 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 1153

微服务 Token 鉴权设计的几种方案

「万事开头难,视频号500粉直播需要你的助力!你的支持是我前进的动力!」Token透传(不推荐)刚开始接触微服务时网上给的方案大都数是通过透传Token做鉴权,但我认为这种方式不是很妥当。接着往下看:图片这种方式通过透传Token使得各微服务都能获取到当前登录人信息,在代码编写上确实可能会方便,但我认为这不是一种很好的设计方式。原因一:内部API与外部API混合在一起不太好区分。原因二:内部调用的...

天行健,君子以自强不息;地势坤,君子以厚德载物。 235

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 好好的系统,为什么要分库分表?
下一篇: SpringBoot 指标监控及日志管理
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值