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

这篇具有很好参考价值的文章主要介绍了微服务架构-服务网关(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拿微信登录第三方应用的例子来说:
gateway接口网关做权限验证,微服务架构,架构,微服务,gateway

  • 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文件,然后在加解密时调用该组件来完成。文章来源地址https://www.toymoban.com/news/detail-563617.html

到了这里,关于微服务架构-服务网关(Gateway)-权限认证(分布式session替代方案)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、授权和鉴权 、网关 、注册与发现 系统架构 docker部署

    源代码地址https://github.com/junkai-li/NetCoreKevin 基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、 docker部署  如需简约项目可直接去除项目引用 解耦设计都可以单独引用 架构默认全部引用并启动 项目启动时

    2023年04月24日
    浏览(33)
  • 【重点】springcloud分布式中gateway+shiro+jwt认证流程(思路)

    项目原来是单体架构,现拆分成spring cloud微服务架构。 如下两个方法的 切入点 都是在ShiroConfig 配置类(@Configuration)中@Bean注入的 :     1 shiroFilterFactoryBean -   JwtFilter 中的onAccessDenied()                  - 无token:直接放过                         -- 登录/login 

    2024年02月10日
    浏览(49)
  • Gateway+Springsecurity+OAuth2.0+JWT 实现分布式统一认证授权!

    目录 1. OAuth2.0授权服务 2. 资源服务 3. Gateway网关 4. 测试   在SpringSecurity+OAuth2.0 搭建认证中心和资源服务中心-CSDN博客 ​​​​​​ 基础上整合网关和JWT实现分布式统一认证授权。   大致流程如下: 1、客户端发出请求给网关获取令牌 2、网关收到请求,直接转发给授权服务

    2024年01月24日
    浏览(38)
  • Springcloud gateway网关+认证服务+token方式,入口层认证统一微服务鉴权【设计实践】

    目录 背景 实现 gateway maven配置 yml配置 页面登录拦截配置类 白名单配置 token工具类 登录配置类 全局过滤器类 项目启动类 分布式项目的单点登录分为认证服务(单点登录服务端)和业务服务(单点登录客户端)两个角色, 当访问业务服务时,认证服务客户端SDK校验一下是否

    2024年02月15日
    浏览(30)
  • 0201概述-网关Gateway-微服务架构

    Spring Cloud Gateway是一个基于Spring Framework 5、Spring Boot 2和Project Reactor等技术开发的API网关,它提供了一系列的过滤器(Filter)来处理HTTP请求和响应,可以轻松地实现路由、负载均衡、限流、重试、熔断、安全控制等功能,可以作为微服务架构中的入口和边缘服务。 Spring Cloud

    2024年02月04日
    浏览(47)
  • 5.微服务项目实战---Gateway--服务网关,实现统一认证、鉴权、监控、路由转发等

    大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。   这样的架构,会存在着诸多的问题: 客户端多次请求不同的微服务,

    2024年02月16日
    浏览(31)
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在

    2024年02月09日
    浏览(38)
  • 微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)

    单体架构 优点:架构简单,维护成本低 缺点:各个模块耦合度太高,当对一个模块进行更新修改时,会影响到其他模块,要一起进行修改。当存在性能瓶颈的时候,需要对整个服务进行扩容,不能有针对性的扩容,如一个程序的主要功能时其中某个服务,要对其增加机器,

    2024年02月04日
    浏览(28)
  • 分布式光伏发电项目服务认证与招投标的关系

    随着全球对清洁能源的需求的不断增长,分布式光伏发电项目作为一种有效的可再生能源解决方案,得到了越来越多的关注。而在分布式光伏发电项目的招投标过程中,服务认证的重要性也日益凸显。 分布式光伏发电项目服务认证是指对从事分布式光伏发电项目的企业或机构

    2024年04月16日
    浏览(28)
  • 9.4. 分布式与微服务架构

    在本章节中,我们将介绍分布式系统和微服务架构的基本概念。分布式系统解决了单体应用面临的可扩展性、高可用性等问题,而微服务架构进一步提升了系统的可维护性和灵活性。 9.4.1. 分布式系统基本概念 分布式系统是由多个独立的计算节点组成的系统,这些节点通过网

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包