Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • 安全框架(认证、授权)

    • 分布式系统认证方案
      • 前言
      • 什么是分布式系统
        • 特点
      • 分布式认证需求
        • 统一认证授权
        • 应用接入授权
      • 分布式认证方案
        • 选型分析
        • 技术方案
      • 后话
    • OAuth2介绍
    • SpringCloudSecurityOAuth2
    • 单点登陆简介
    • 认证中心整合
  • 分布式事务

  • 消息队列

  • K8S

  • 分布式
  • 安全框架(认证、授权)
SaulJWu
2021-02-19

分布式系统认证方案

# 前言

在分布式开发中,我们需要了解一下什么是分布式系统以及它的特性。只有了解了这些知识点,才方便我们后面学习分布式系统的认证授权。

# 什么是分布式系统

随着软件环境和需求的变化,软件的架构由单体结果演变为分布式架构,具有分布式架构的系统叫分布式系统,分布式系统的运行通常依赖网络,它将单体结果的系统分为若干服务,服务之间通过网络交互来完成用户的业务处理,当前流行的微服务结构就是分布式系统,如下图:

image-20210219134947293

# 特点

分布式系统具体由如下基本特点:

  • 1、分布性:每个部分都可以独立部署,服务之间交互通过网络进行通信,比如:订单服务、商品服务。
  • 2、伸缩性:每个部分都可以集群方式部署,并可针对部分结点进行硬件及软件扩容,具有一定的伸缩能力。
  • 3、共享性:每个部分都可以作为共享资源对外提供服务,多个部分可能有操作共享资源的情况。
  • 4、开发性:每个部分根据需求都可以对外发布共享资源的访问接口,并可允许第三方系统访问。

# 分布式认证需求

分布式系统的每个服务都会有认证、授权的需求,如果每个服务都实现一套认证授权逻辑会非常冗余,考虑分布式系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求;考虑分布式系统开发的特点,不仅对系统内部的服务提供认证,对第三方系统也要提供认证。

分布式认证的需求总结如下:

# 统一认证授权

  • 1、提供独立的认证服务,统一处理认证授权。
  • 2、无论是不同类型的用户,还是不同种类的客户端(web端、H5、APP),均采用一致的认证、权限、会话机制,实现统一认证授权。
  • 3、要实现统一则认证方式必须可拓展,支持各种认证需求,比如:用户密码认证、短信验证码、二维码、人脸识别等方式,并可以非常灵活的切换。

# 应用接入授权

应提供拓展和开放能力,听安全的系统对接机制,并可开放部分API给接入第三方使用,一方应用(内部系统服务)和三方引用(第三方引用)均采用统一机制接入。

# 分布式认证方案

# 选型分析

# 1、基于session的认证方式

在分布式的环境下,基于seesion的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通过负债均衡将本地的请求分配到另一个应用服务需要将session信息带过去,否则会重新认证。

image-20210219140835909

这个时候,通常的做法有下面几种:

**Seesion复制:**多台应用服务器之间同步session,使session保持一致,对外透明。

**Session黏贴:**当用户访问集群中某台服务器后,强制指定后续所有请求均落到此机器上。

**Session集中存储:**将session存储分布式缓存(redis)中,所有服务器应用实例统一从分布式缓存中存取Session。(谷粒商城的视频就是这么做的)

总体来讲,基于session认证的认证方式,可以更好的在服务端对会话进行控制,且安全性较高。但是,session机制方式基于cookie,在复杂多样的移动客户端上不能有效的使用,并且无法跨域,另外随着系统的拓展需要提高session的复制、黏贴及存储的容错性。

所以在分布式系统中,在前后端分离和移动应用中,基于session的认证方式就显得不太适合了,虽然可以实现,但没必要。

# 2、基于token的认证方式

由于token的认证方式,服务端不用存储认证数据,易维护拓展强,客户端可以把token存在任意地方,并且可以实现web和app统一认证机制。其缺点也很明显,token由于自包含信息,因此一般数据量较大,而且每次请求都需要传递,因此比较占带宽。另外,token的签名签操作也会给cpu带来额外的处理负担。

image-20210219141642633

# 技术方案

根据选定分析,决定采用基于token的认证,它的优点是:

  • 1、适合统一认证的机制,客户端、一方应用、三方应用都遵循一致的认证机制。
  • 2、token认证方式对第三方应用接入更合适,因为它更开放,可使用当前流行的开发协议Oauth2.0、JWT等。
  • 3、一般情况服务端无需存储会话信息,减轻了服务端的压力。

分布式系统认证技术方案见下图:

image-20210219142146021

1、接入方请求授权服务认证

2、认证服务验证登陆用户及接入客户端

3、返回access_token到接入方

4、接入方携带token访问资源,需要发送到网关

5、网关校验token,验证接入端权限

6、附加解析后明文token,转发请求到微服务

7、微服务解析并验证用户权限,若通过则执行业务逻辑,返回结果到接入方

# 后话

通过上面的流程,就算是知道了微服务的真实地址,微服务自身也会校验一次,防止没有权限的请求直接越过网关访问到资源。

后面会详细讲解实现方法。

帮我改善此页面 (opens new window)
上次更新: 2021/07/06, 07:40:33
OAuth2介绍

OAuth2介绍→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式