Spring Security OAuth2.0(12):分布式系统认证方案
本章代码已分享至Gitee:https://gitee.com/lengcz/distributed-security01.gitSpring Security OAuth2.0 分布式系统认证方案什么是分布式系统随着软件环境和需求的变化软件的架构由单体结构演变成分布式架构具有分布式架构的系统叫做分布式系统分布式系统的运行通常依赖网络它将单体结构的系统分为若干服务服务之间通过网络交互来完成用户的业务处理当前流行的微服务架构就是分布式系统架构如下图分布式系统具有如下基础特点分布性每个部分都可以独立部署服务之间交互通过网络进行通信比如订单服务、商品服务。伸缩性每个部分都可以通过集群并可针对部分节点进行硬件及软件扩容具有一定的伸缩能力。共享性每个部分都可以作为共享资源对外提供服务多个部分可能有操作共享资源的情况。开发性每个部分根据需求都可以对外发布共享资源的访问接口并可以允许第三方系统访问。分布式认证需求分布式系统的每个服务都会有认证、授权的需求如果每个服务都实现一套认证授权逻辑会非常冗余考虑分布式系统共享性的特点需要由独立的认证服务处理系统认证授权的请求考虑分布式系统开放性的特点不仅对系统内部服务提供认证对第三方系统也要提供认证。分布式认证的需求总结如下统一认证授权提供独立的认证服务统一处理认证授权。无论是不同类型的用户还是不同种类的客户端web,H5,APP,均采用一致的认证、权限、会话机制实现统一认证授权。要实现统一则认证方式必须可扩展支持各种认证需求比如用户名密码、短信验证码、二维码、人脸识别等方式并可以非常灵活的切换。应用接入认证应用共扩展和开放能力提供安全的系统对接机制并可开放部分API给接入第三方使用一方应用内部系统服务和三方应用第三方应用均采用统一机制接入。选型分析基于session 的认证在分布式的环境下基于session的认证会出现一个问题每个应用服务都需要在session中存储用户身份信息通过负载均衡将本地的请求分配到另一个应用服务需要将session 信息带过去否则会重新认证。这个时候通常的做法有下面几种session复制多态应用服务器之间同步session使session保持一致对外透明。session黏贴当用户访问集群中某台服务器时强制指定后续所有请求均落到此机器上。session集中存储将session存入分布式缓存中所有应用服务器实例统一从分布式缓存中存取session。总体来讲基于session 认证的认证方式可以更好的在服务端对会话进行控制且安全性较高。但是session机制方式基于cookie 在复杂多样的移动客户端上不能有效使用并且无法跨越另外随着系统的扩展需要提高session复制、黏贴及存储的容错性。2 基于token的认证方式基于token 的认证方式服务端不用存储认证数据易维护扩展性强客户端可以把token存在任意地方并且可以实现web和app统一认证机制。其缺点也很明显token 由于自身含信息因此一般数据量较大而且每次请求都需要传递因此比较占带宽。另外token的签名验签操作也会给cpu带来额外的处理负担。技术方案根据选型的分析决定采用基于token 的认证方式它的优点是适合统一认证的机制客户端、一方应用、三方应用都遵循一致的认证机制。token认证方式对第三方应用接入更合适因为它更开放可使用当前有流行的开放协议Oauth2.0JWT等。一般情况服务端无需存储会话信息减轻了服务端的压力。分布式系统认证技术方案如下图