微服务架构-服务网关(Gateway)-权限认证(分布式session替代方案)

权限认证-分布式session替代方案

前面我们了解了Gateway组件的过滤器,这一节我们就探讨一下Gateway在分布式环境中的一个具体用例-用户鉴权。

1、传统单应用的用户鉴权

从我们开始学JavaEE的时候,就被洗脑式灌输了一种权限验证的标准做法,那就是将用户的登录状态保存到HttpSession中,比如在登录成功后保存一对key-value值到session,key是userld而value是用户后台的真实ID。

接着创建一个ServletFilter 过滤器,用来拦截需要登录才能访问的资源,假如这个请求对应的服务端session里找不到userld这个key,那么就代表用户尚未登录,这时候可以直接拒绝服务然后重定向到用户登录页面。

大家应该都对session机制比较熟悉,它和cookie是相互依赖的,cookie是存放在用户浏览器中的信息,而session则是存成在股务器端的。当浏览器发起服务请求的时候就会带上cookie,服务器端接到Request后根据cookie中的jsessionid拿到对应的session。

由于我们只启动一台服务器,所以在登录后保存的session始终都在这台服务器中,可以很方便的获取到 session中的所有信息,用这方法我们一路搞定了各种课程作业和毕业设计,结果一到工作岗位发现行不通了,因为所有应用都是集群部署,在一台机器保存了的session无法同步到其他机器上,那我们有什么成熟的解决方案吗?

2、分布式环境下的解决方案

2.1)同步session

session复制是最容易先想到的解决方案,我们可以把一台机器中的session复制到集群中的其他机器。

比如Tomcat中也有内置的session同步方案,但这并不是一个很优雅的解决方案,它会带来以下两个问题:

Timing问题: 同步需要花费一定的时间,我们无法保证session同步的及时性,也就是说,当用户发起的两个请求分别落在不同机器上的时候,前一个请求写入session的信息可能还没同步到所有机器,后一个请求就已经开始执行业务逻辑了,这不免引起脏造幻读。

数据冗余: 所有服务器都需要保存一份session全集,这就产生了大量的冗余数据

2.2)反向代理: 绑定IP或一致性Hash

这个方案可以放在Nginx网关层做,我们可以指定某些IP段的请求落在某指定机器上,这样一来session始终只存在一台机器上,不过相比前一种session复制的方法来说,绑定IP的方式有更明显的缺陷:

负载均衡: 在绑定IP的情况下无法在网关层应用负载均衡策略,而且某个服务器出现故障的话会对指定IP段的来访用户产生较大影响,对网关层来说该方案的路由规则配置也极其麻烦;

IP变更: 很多网络运营商会时不时切换用户IP,这就会导致更换IP后的请求被路由到不同的服务节点处理,这样一来就读不到前面设置的session信息了。

为了解决第二个问题,可以通过一致性Hash的路由方案来做路由,比如根据户ID做Hash,不的Hash值落在不同的机器上,保证足够均匀的分配,这样也就避免了IP切换的问题,但依然无法解决第一点里提到的负载均衡问题。

2.3)Redis解决方案

这个方案解决了前面提到的大部分问题,session不再保存在服务器上,取而代之的是保存在redis中,所有的服务器都向redis写入/读取缓存信息。

在Tomcat层面,我们可以直接到入tomcat-redis-session-manager组件,将容器层面的session组件替换为基于redis的组性,但是这种方案和容器绑定的比较紧密。

另一个更优雅的方家是借助spring-session管理redis中的session。尽管这个方案脱离了具体容器,但依然是基于session的用户鉴权方案,这类session方案已务在微服务应用被淘汰了。

2.4)分布式Session的替代方案

让我们把session抛到脑后,看看现在流行的两种认证方式:

2.4.1)OAuth 2.0

大家一定用过现在比较流行的第三方登录,比如我们通过微信扫码登录就可以登录某个应用的在线系统,但是这个应用并不知道我的微信用户名和密码,这便是我们要介绍的第一个鉴权方案-OAuth 2.0。

OAuth 2.0是一个开放授权标准协议,它允许用户让第三方应用访问该用户在某服务的特定私有资源,但是不提供账号密码信息给第三方应用。

在上面的例子中,微信就相当于一个第三方应用,我们通过OAuth 2.0拿微信登录第三方应用的例子来说:
在这里插入图片描述

  • Auth Grant : 在这一步CIient发起 Authorization Request 到微信系统(比如通过微信内扫码授权),当身份验证成功后获取Auth Grant;
  • Get Token: 客户端拿着从微信获取到的Auth Grant,发给第三方引用的鉴权服务,换取一个Token,这个Token就是访问第三方应用资源所需要的令牌;
  • 访问资源: 最后一步,客户端在请求资源的时候带上Token令牌,服务端验证令牌真实有效后即返回指定资源。

我们可以借助Spring Cloud中内置的 spring-cloud-starter-oauth2 组件搭建OAuth 2.0的鉴权服务,OAuth 2.0的协议还涉及到很多复杂的规范,比如角色、客户端类型、授权模式等。这一小节我们暂且不深入探讨OAuth 2.0的实现方式,先来看另外一个更轻量级的授权方案:JWT鉴权。

2.4.2)JWT鉴权

JWT也是一种基于Token的鉴权机制,它的基本思想就是通过用户名+密码换取一个Access Token。

2.4.2.1)鉴权流程

相比OAuth 2.0来说,它的鉴权过程更加简单,其基本流程是这样的:

1、用户名+密码访问鉴权服务

  • 验证通过:服务器返回一个Access Token给客户端,并将token保存在服务端某个地方用于后面的访问控制(可以保存在数据库或者Redis中);
  • 验证失败:不生成Token。

2、客户端使用令牌访问资源,服务器验证令牌有效性

  • 令牌错误或过期:拦截请求,让客户端重新申请令牌;
  • 令牌正确: 允许放行
2.4.2.2)Access Token中的内容

JWT的Access Token由三个部分构成,分别是Header、 Payload和Signature,我们分别看下这三个部分都包含了哪些信息:

Header: 头部声明了Token的类型 (JWT类型) 和采用的加密算法 (HS256);

{
  'typ': 'JWT',
  'alg': 'HS256'
}

**Payload:**这一段包含的信息相当丰富,你可以定义Token签发者、签发和过期时间、生效时间等一系列属性,还可以添加自定义属性,服务端收到Token的时候也同样可以对Payload中包合的信息做验证,比如说某个Token的签发者是"Feign-API",假如某个接口只能允许"Gateway-API"签发的Token,那么在做鉴权服务时就可以加入lssuer的判断逻辑。

Signature: 它会使用Header和Payload以及一个密钥用来生成签证信息,这一步会使用Header里我们指定的加密算法进行加密

目前实现JWT的开源组件非常多,如果决定使用这个方案,只要添加任意一个开源JMT实现的依赖项到项目中的POM文件,然后在加解密时调用该组件来完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/10426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:集群管理的一些建议

在之前的文章 “Elasticsearch:集群管理” ,我们对集群管理做了一些介绍。在今天的文章中,我们接着来聊一下有关配置的方面的问题。这在很大程度上取决于你的用例,是索引还是搜索繁重。 我们将在这里讨论在集群设置方面我们需要关…

Leetcode.130 被围绕的区域

题目链接 Leetcode.130 被围绕的区域 mid 题目描述 给你一个 m x n的矩阵 board,由若干字符 X和 O,找到所有被 X围绕的区域,并将这些区域里所有的 O用 X填充。 示例 1: 输入:board [[“X”,“X”,“X”,“X”],[“X…

「Cpolar」使用Typecho搭建个人博客网站【内网穿透实现公网访问】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

在 Python 中计算两个数字之间的百分比

要计算两个数字之间的百分比,请将一个数字除以另一个数字,然后将结果乘以 100,例如 (30 / 75) * 100。这显示第一个数字占第二个数字的百分比。 在示例中,30 是 75 的 40%。 def is_what_percent_of(num_a, num_b):return (num_a…

基于SVG的HMI组件

人机界面是自动化领域不可或缺重要组成部分。人机界面系统的设计看上去并没有太大的技术门槛,但是设计一个HMI系统的工作量是巨大的,如果你没有足够的耐心和精力是难以完成一个通用HMI系统的。构建UI控件库就是一个似乎永远完不成的事情,用户…

Halo博客建站实战以及问题汇总

目录 简介 特性 快速开始 安装步骤 环境准备 Docker-compose方式部署 问题汇总 mac端无法访问页面 页面登录提示账号密码错误 重装注意点 资料 官方文档 简介 Halo 强大易用的开源建站工具 特性 代码开源 我们的所有代码开源在 GitHub 上且处于积极维护状态&…

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…

HCIA第二次笔记

目录 OSI/RM七层参考模型——开放式的系统互联参考模型 核心——分层 TCP/IP模型——TCP/IP协议簇 应用层 应用层协议 封装与解封装 传输层 TCP协议和UDP协议的区别 TCP的报文 TCP的三次握手 TCP的四次挥手 TCP的四种可靠传输机制 OSI/RM七层参考模型——开放式的系…

[目标识别-论文笔记]Object Detection in Videos by Short and Long Range Object Linking

文章标题&#xff1a;2018_Cite13_Tang——Object Detection in Videos by Short and Long Range Object Linking 这篇论文也被叫做“2019_Cite91_TPAMI_Tang——Object Detection in Videos by High Quality Object Linking” 如果这篇博客对你有帮助&#xff0c;希望你 点赞…

学生信息管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87673902 更多系统资源库…

【设计模式】如何在业务开发中使用适配器模式?

文章目录前言适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构总结前言 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff1a;将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个…

高速Serdes技术(FPGA领域应用)

目录引入一、Serdes&#xff08;概念-历程&#xff09;1、概念2、技术现状3、发展历程二、Serdes结构三、在FPGA领域中的运用四、Serdes跟Lvds的关系五、Xilinx 有关 serdes的文档六、参考文献引入 回顾接口技术发展历史&#xff0c;其实数据的传输最开始是低速的串行接口&…

OSI七层网络模型与TCP/IP四层模型

一、OSI七层网络模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 但由于各方面原因&#xff0c;OSI 七层模型并没有被广泛应用&#xff0c;更多的是作为网络分层的一种基础理论模型。 二、TCP/IP…

NumPy 基础知识 :1~5

原文&#xff1a;Numpy Essentials 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 一、NumPy 简介 “我宁愿使用通用语言进行数学运算&#xff0c;也不愿尝试使用数学语言进行通用编程。” – John D Cook 在过去的十年中&#xff0c;Python 已成为科学计算中最受欢迎…

MVCC

MVCC基本概念 当前读 当前读 : 读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁. 对于我们日常的操作. 如 : select....lock in share mode(共享锁) , select * for update , update ,insert,delete(排他锁) 都是一种当前读. 快…

Java对象模型

介绍 Java是一种面向对象的语言&#xff0c;而Java对象在JVM中存储是由一定结构的。而这个 Java对象自身的存储模型称之为Java对象模型HotSpot虚拟机中&#xff0c;设计了一个OOP-Klass Model.OOP指的是普通对象指针&#xff0c;而Klass用来描述对象的具体类型。如下图所示是一…

文章生成器写出来的原创文章

文章生成机器人 文章生成机器人是一种基于人工智能技术和自然语言处理算法的程序&#xff0c;可以自动地生成高质量、原创的文章。 文章生成机器人的优点如下&#xff1a; 提高工作效率&#xff1a;文章生成机器人能够在较短的时间内自动帮助用户生成大量的文章&#xff0c;提…

Python 小型项目大全 21~25

二十一、DNA 可视化 原文&#xff1a;http://inventwithpython.com/bigbookpython/project21.html 脱氧核糖核酸是一种微小的分子&#xff0c;存在于我们身体的每个细胞中&#xff0c;包含着我们身体如何生长的蓝图。它看起来像一对核苷酸分子的双螺旋结构&#xff1a;鸟嘌呤、…

计算机网络微课堂1-3节

目录 1. TCP/TP协议​编辑 2. 3.调制解调器 4.因特网的组成 5.电路交换 6.分组交换 重要常用 7.报文交换 8.总结电路交换 报文交换和分组交换 9. 1. TCP/TP协议 2. ISP 网络提供商 ISP的三层 国际 国家 和本地 3.调制解调器 什么是调制解调器&#xff0c;它存在的…

Python 小型项目大全 11~15

十一、标题党生成器 原文&#xff1a;http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告&#xff01;但是想出有创意的原创内容太难了。幸运的是&#xff0c;有了标题党生成器&#xff0c;我们可以让一台计算机产生数百万个令人发指的…