古人学问无遗力,少壮工夫老始成。这篇文章主要讲述#私藏项目实操分享#权限设计系列「认证授权专题」微服务架构的登陆认证问题相关的知识,希望能为你提供帮助。
预备知识
本文讨论基于微服务架构下的身份认证和用户授权的技术方案,最好先熟悉并理解以下几个知识点:
- 微服务架构相关概念:服务注册、服务发现、API 网关
- 身份认证和授权技术:SSO、CAS、OAuth2.0、JWT
- 认证
- 授权
- 鉴权
- 权限控制
当企业的应用系统逐渐增多后,每个系统单独管理各自的用户数据容易行成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进。当企业的互联网业务发展到一定规模,构建统一的标准化账户管理体系将是必不可少的,因为它是企业互联网云平台的重要基础设施,能够为平台带来统一的帐号管理、身份认证、用户授权等基础能力,为企业带来诸如跨系统单点登录、第三方授权登录等基础能力,为构建开放平台和业务生态提供了必要条件。
模式介绍
在微服务架构下,必须对企业的平台生态进行合理的业务划分,每个业务板块将自成系统,这些系统业务比较独立,应当独立拆分。每个系统又可根据各自的业务模型进行切分,将业务模型和用户需求统筹分析后建立恰当的领域模型,形成独立的服务。
另外,企业平台的客户范围比较复杂,有2B的业务,也有2C的,还有 2G(goverment)的,因此平台级的统一身份管理必须涉及组织实体和个人实体两类,其中组织实体包括机关(G)、企业单位(B)、团体组织(B)等,这类似于多租户架构的概念,但又比传统多租户架构复杂。
微服务架构的登陆认证问题
从过去单体应用架构到分布式应用架构再到现在的微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的更新变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案。
统一身份管理(Unified Identity Manager)统一身份管理(UIM)是整个平台帐号和权限管控的基础,由此构建的系统称为UIMS(Unified Identity Management System),平台下所有系统的账户管理、身份认证、用户授权、权限控制等行为都经由 UIMS 处理,提供帐号password管理、基本资料管理、角色权限管理等功能。
UIMS 基于『统一身份治理』的概念,可划分为两级账户体系、基础权限模块和基础信息模块三大模块。其中两级账户体系将账户分为组织实体帐号和个人实体账户两大类,个人实体从属于组织实体,也可以不从属任何组织实体,且个人实体可同时从属于多个组织实体;基础权限模块将各业务系统的资源权限进行统一管理和授权;
基础信息模块用于描述组织实体和个人实体的基本信息,如组织实体名称、地址、法人,个人实体姓名、电话号码、性别等基础信息。UIMS 提供统一的 API 与各子系统连接。众多系统和众多服务都将依赖于 UIMS 。
本文仅涉及 UIMS 下的两级账户体系和基础权限模块这两个模块,据此可以独立出账户管理服务和权限管理服务,也可以合并成一个账户权限管理服务。其中账户管理服务包括业务系统实体、组织实体和个人实体管理、权限管理服务包含认证、授权和鉴权三个部分。
单点登录(SSO)企业平台涉及众多子系统,为简化各子系统的用户管理,提升用户体验,因此实现 SSO 是统一身份认证的重要目标:一次登录,全部访问。
- 对于企业内部应用来说,SSO 是必须的选项,例如企业 OA、HR、CRM 等内部系统;
- 对于外部应用来说,SSO 是可选项,具体哪个应用应当加入 SSO 系统,由该业务系统决定。
授权登录随着平台业务的逐渐增长,依托于平台的,和平台依托的厂商和客户等资源将极大的丰富平台,因此必须构筑开放的生态系统,以支撑业务的进一步发展。可以开放平台级的授权登录功能,以允许第三方应用接入。通过三方授权登录,将平台的服务各能力开发给第三方,并将第三方的服务和能力接入平台,繁荣共生,共同发展。
服务间鉴权业务系统切分出不同的服务,根据粒度粗细和业务需求不同,服务的数量和权限要求都不同。微服务架构下的身份认证和授权,可分为两种:
- 内部服务的认证和授权;
- 内部服务处于安全的内网环境之下,例如 BFF 层(Backend For Frontend Layer)的商品服务、订单服务等,在对安全需求不高的情况下,可不执行认证过程,服务与服务之间是相互信任的。
- 外部服务的认证和授权。
- 外部服务的认证和授权,通常由外部应用发起,通过反向代理或网关向安全边界内的服务发起请求,因此必须执行严格的认证过程。无线端APP、Web端、桌面客户端等外部应用下的各类服务,都属于外部服务。
文章图片
技术方案
备选方案提出了统一身份管理系统(UIMS)下关于身份认证和授权部分的主要需求,目前实现统一身份认证和授权的技术手段较多,总体可以归纳为以下两类:
- 传统的 Cookie + Session 解决方案,有状态会话模式;
- 基于令牌/票ticket的解决方案,无状态交互模式。
- 分布式 Session
- OAuth2.0
- CAS
分布式 Session分布式Session是老牌的成熟解决方案,但因其状态化通信的特性与微服务提倡的API导向无状态通信相互违背,且共享式存储存在安全隐患,因此微服务一般不太采用。
分布式 SessionOAuth2.0是业内成熟的授权登录解决方案,然而 OAuth2.0 提供了4种授权模式,能够适应多种场景,作为基于令牌的安全框架,可以广泛用于需要统一身份认证和授权的场景。
一般会采用 JWT 作为令牌的主要标准:JWT(JSON Web Token)是一种简洁的自包含的 JSON 声明规范,因其分散存储和自解签等特点而广泛应用于非集中式认证/授权场景。
由于 JWT 信息是经过签名的,可以确保发送方的真实性,确保信息未经篡改和伪造。但由于其自包含的客户端验签特性,令牌一经签发,即无法撤销,因此单纯采用 JWT 作为统一身份认证和授权方案无法满足帐号统一登出和销毁、帐号封禁和解除这几种类型的需求,所以一般配合 OAuth2.0 一起使用。
关于 JWT 的介绍,CAS 是时下最成熟的开源单点登录方案,包含 CAS Server 和 CAS Client 两部分。
- CAS Server 是一个 war 包需要独立部署,负责用户认证;
- CAS Client 负责处理对客户端受保护资源的访问请求,需要认证时,重定向到 CAS Server。
关于 CAS 的介绍,请参考 https://apereo.github.io/cas/
在微服务架构下,身份认证和用户授权通常分离出来成为独立的 IDP (Identity Provider)服务。在做技术选型时,应从以下几点考虑:
- 满足 SSO 的技术需求;
- 满足简便性和安全性的需求;
- 满足开放性和扩展性的需求。
- 综合考虑,推荐采用无状态 API 模式,其中基于 OAuth2.0 的方案能够完全满足
客户端 Token 与 API 网关结合这个方案意味着所有请求都通过网关,从而有效地隐藏了微服务。 在请求时,网关将原始用户令牌转换为内部会话 ID 令牌。在这种情况下,注销就不是问题,因为网关可以在注销时撤销用户的令牌。
参考资料https://www.jianshu.com/p/2571f6a4e192
推荐阅读
- Intune中win32应用部署---Intune终结点管理(10)
- CSS实现一只自由飞翔的鸟儿?#yyds干货盘点#
- Rocky Linux 8 install wechat idea goland
- 构建Neo4j使用已存在的VPC和子网
- 在自定义帖子WordPress上分页
- 在functions.php中需要父文件时,如何覆盖子WordPress主题中的父文件
- WordPress中带有the_post_thumbnail的图像标题
- 如何在wordpress插件中包含背景图片网址()
- 如何在wordpress中使用get_post()将get_template_part()用于特定帖子()