权限设计系列「认证授权专题」微服务架构的登陆认证问题

洛神灬殇 洛神灬殇     2022-12-28     323

关键词:

预备知识

本文讨论基于微服务架构下的身份认证和用户授权的技术方案,最好先熟悉并理解以下几个知识点:

  • 微服务架构相关概念:服务注册、服务发现、API 网关

  • 身份认证和授权技术:SSO、CAS、OAuth2.0、JWT

以下几个基础概念:

  • 认证
  • 授权
  • 鉴权
  • 权限控制

前提背景

当企业的应用系统逐渐增多后,每个系统单独管理各自的用户数据容易行成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进。当企业的互联网业务发展到一定规模,构建统一的标准化账户管理体系将是必不可少的,因为它是企业互联网云平台的重要基础设施,能够为平台带来统一的帐号管理、身份认证、用户授权等基础能力,为企业带来诸如跨系统单点登录、第三方授权登录等基础能力,为构建开放平台和业务生态提供了必要条件。

模式介绍

在微服务架构下,必须对企业的平台生态进行合理的业务划分,每个业务板块将自成系统,这些系统业务比较独立,应当独立拆分。每个系统又可根据各自的业务模型进行切分,将业务模型和用户需求统筹分析后建立恰当的领域模型,形成独立的服务。

另外,企业平台的客户范围比较复杂,有2B的业务,也有2C的,还有 2G(goverment)的,因此平台级的统一身份管理必须涉及组织实体和个人实体两类,其中组织实体包括机关(G)、企业单位(B)、团体组织(B)等,这类似于多租户架构的概念,但又比传统多租户架构复杂。

微服务架构的登陆认证问题

从过去单体应用架构到分布式应用架构再到现在的微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的更新变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案。

统一身份管理(Unified Identity Manager)

统一身份管理(UIM)是整个平台帐号和权限管控的基础,由此构建的系统称为UIMS(Unified Identity Management System),平台下所有系统的账户管理、身份认证、用户授权、权限控制等行为都经由 UIMS 处理,提供帐号密码管理、基本资料管理、角色权限管理等功能。

UIMS 基于『统一身份治理』的概念,可划分为两级账户体系、基础权限模块和基础信息模块三大模块。其中两级账户体系将账户分为组织实体帐号和个人实体账户两大类,个人实体从属于组织实体,也可以不从属任何组织实体,且个人实体可同时从属于多个组织实体;基础权限模块将各业务系统的资源权限进行统一管理和授权;

基础信息模块用于描述组织实体和个人实体的基本信息,如组织实体名称、地址、法人,个人实体姓名、电话号码、性别等基础信息。UIMS 提供统一的 API 与各子系统连接。众多系统和众多服务都将依赖于 UIMS 。

本文仅涉及 UIMS 下的两级账户体系和基础权限模块这两个模块,据此可以独立出账户管理服务和权限管理服务,也可以合并成一个账户权限管理服务。其中账户管理服务包括业务系统实体、组织实体和个人实体管理、权限管理服务包含认证、授权和鉴权三个部分。

单点登录(SSO)

企业平台涉及众多子系统,为简化各子系统的用户管理,提升用户体验,因此实现 SSO 是统一身份认证的重要目标:一次登录,全部访问。

  • 对于企业内部应用来说,SSO 是必须的选项,例如企业 OA、HR、CRM 等内部系统;
  • 对于外部应用来说,SSO 是可选项,具体哪个应用应当加入 SSO 系统,由该业务系统决定。

例如,外部商城、物业系统等对外服务系统。无论何种应用是否采用 SSO,UIMS 在技术上应当具备 SSO 的能力。

授权登录

随着平台业务的逐渐增长,依托于平台的,和平台依托的厂商和客户等资源将极大的丰富平台,因此必须构筑开放的生态系统,以支撑业务的进一步发展。可以开放平台级的授权登录功能,以允许第三方应用接入。通过三方授权登录,将平台的服务各能力开发给第三方,并将第三方的服务和能力接入平台,繁荣共生,共同发展。

服务间鉴权

业务系统切分出不同的服务,根据粒度粗细和业务需求不同,服务的数量和权限要求都不同。微服务架构下的身份认证和授权,可分为两种:

  • 内部服务的认证和授权;

    • 内部服务处于安全的内网环境之下,例如 BFF 层(Backend For Frontend Layer)的商品服务、订单服务等,在对安全需求不高的情况下,可不执行认证过程,服务与服务之间是相互信任的。
  • 外部服务的认证和授权。

    • 外部服务的认证和授权,通常由外部应用发起,通过反向代理或网关向安全边界内的服务发起请求,因此必须执行严格的认证过程。无线端APP、Web端、桌面客户端等外部应用下的各类服务,都属于外部服务。

技术方案

备选方案

提出了统一身份管理系统(UIMS)下关于身份认证和授权部分的主要需求,目前实现统一身份认证和授权的技术手段较多,总体可以归纳为以下两类:

  1. 传统的 Cookie + Session 解决方案,有状态会话模式;
  2. 基于令牌/票ticket的解决方案,无状态交互模式。

具体有

  • 分布式 Session
  • OAuth2.0
  • CAS

上述方案各有利弊:

分布式 Session

分布式Session是老牌的成熟解决方案,但因其状态化通信的特性与微服务提倡的API导向无状态通信相互违背,且共享式存储存在安全隐患,因此微服务一般不太采用。

分布式 Session

OAuth2.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 是一个认证框架,其本身定义了一套灵活完整的认证流程,但其兼容主流的认证和授权协议如 OAuth2、SAML、OpenID 等,因此一般采用 CAS + OAuth2 的方案实现 SSO 和授权登录。

关于 CAS 的介绍,请参考 https://apereo.github.io/cas/
在微服务架构下,身份认证和用户授权通常分离出来成为独立的 IDP (Identity Provider)服务。在做技术选型时,应从以下几点考虑:

  • 满足 SSO 的技术需求;
  • 满足简便性和安全性的需求;
  • 满足开放性和扩展性的需求。
  • 综合考虑,推荐采用无状态 API 模式,其中基于 OAuth2.0 的方案能够完全满足
客户端 Token 方案

令牌在客户端生成,由身份验证服务进行签名,并且必须包含足够的信息,以便可以在所有微服务中建立用户身份。令牌会附加到每个请求上,为微服务提供用户身份验证,这种解决方案的安全性相对较好,但身份验证注销是一个大问题,缓解这种情况的方法可以使用短期令牌和频繁检查认证服务等。对于客户端令牌的编码方案,Borsos 更喜欢使用 JSON Web Tokens(JWT),它足够简单且库支持程度也比较好。

客户端 Token 与 API 网关结合

这个方案意味着所有请求都通过网关,从而有效地隐藏了微服务。 在请求时,网关将原始用户令牌转换为内部会话 ID 令牌。在这种情况下,注销就不是问题,因为网关可以在注销时撤销用户的令牌。

参考资料

https://www.jianshu.com/p/2571f6a4e192

权限设计系列「认证授权专题」微服务中的jwt协议以及全方面指南(代码片段)

JWT介绍说明JSONWebToken(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC7519)。来自JWTRFC7519标准化的摘要说明:JSONWebToken是一种紧凑的,URL安全的方式,表示要在双方之间传... 查看详情

权限设计系列「认证授权专题」史上最全的权限认证服务的权限模型大全

权限模型迄今为止最为普及的权限设计模型是RBAC模型,基于角色的访问控制(Role-BasedAccessControl)RBAC0模型这是权限最基础也是最基础且核心的模型,它包括用户/角色/权限,其中用户和角色是多对多的关系,角色和权限也是多... 查看详情

微服务架构中的认证授权设计

】微服务架构中的认证授权设计【英文标题】:AuthenticationandAuthorizationDesigninMicroserviceArchitecture【发布时间】:2021-06-0418:33:25【问题描述】:我正在使用微服务架构开发应用程序。需要实施安全性。所以我计划使用3项服务来实现... 查看详情

使用微服务架构思想,设计部署oauth2.0授权认证框架(代码片段)

...甚至可能是第三方提供的WebAPI。同时处于系统安全的架构设计,后端WebAPI是不能直接暴露在外面的;另一方面,我们这个新产品还有一个C/S系统,C端登录的时候,要求 查看详情

微服务架构中整合网关权限服务(代码片段)

前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关、权限系统。安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,没有具体的示例。业务权... 查看详情

每日一博-微服务权限一二事

...方案一鉴权方案二鉴权方案三其他方案小结概念普及关于权限,先了解几个核心的概念认证授权鉴权认证举个例子:输入用户名/密码,点击登录后,后台执行的业务逻辑就是认证---------->验证用户名/密码是否正... 查看详情

每日一博-微服务权限一二事

...处理方式微服务架构下的认证、授权、鉴权概念普及关于权限,先了解几个核心的概念认证授权鉴权认证举个例子:输入用户名/密码,点击登录后,后台执行的业务逻辑就是认证---------->验证用户名/密码是否正... 查看详情

微服务架构中的授权/认证

】微服务架构中的授权/认证【英文标题】:Authorization/AuthenticationinMicroserviceArchitecture【发布时间】:2020-10-1103:46:25【问题描述】:我有:myApp(服务器1)用户身份验证微服务+用户数据库(服务器2)用户身份验证微服务有一个RES... 查看详情

springcloud与微服务学习总结(16)——微服务架构统一安全认证设计与实践

...体系下,应用是一个整体,一般针对所有的请求都会进行权限校验。请求一般会通过一个权限的拦截器进行权限的校验,在登录时将用户信息缓存到session中,后续访问则从缓存中获取用户信息。随着RestfulAPI、微服 查看详情

springcloud与微服务学习总结(16)——微服务架构统一安全认证设计与实践

...体系下,应用是一个整体,一般针对所有的请求都会进行权限校验。请求一般会通过一个权限的拦截器进行权限的校验,在登录时将用户信息缓存到session中,后续访问则从缓存中获取用户信息。随着RestfulAPI、微服 查看详情

微服务架构的登陆认证问题

...断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的更新变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本... 查看详情

微服务认证架构

】微服务认证架构【英文标题】:MicroserviceAuthenticationArchitecture【发布时间】:2019-05-2715:09:32【问题描述】:我开始编写一些具有独立Web客户端、集中式身份验证和授权服务以及组织服务的微服务。组织服务将跟踪谁属于哪个组... 查看详情

09-微服务版的单点登陆系统设计及实现(代码片段)

文章目录简介背景分析单点登陆系统快速入门实践工程结构如下:创建认证授权工程添加项目依赖构建项目配置文件添加项目启动类启动并访问项目自定义登陆逻辑业务描述定义安全配置类定义用户信息处理对象网关中登陆路由... 查看详情

springsecurityoauth2架构学习(代码片段)

...服务器请求令牌3.服务端校验令牌,如果成功则授予相应的权限访问资源,获取对应的资源或者个人信息. Oauth2这个是为了方便安全的用户(第三方)登录用的。一开始听见oauth2这个词肯定是很懵的。这是啥,鉴权用的?认证... 查看详情

微服务架构中的 SPA 认证

】微服务架构中的SPA认证【英文标题】:AuthenticationforSPAinMicroservicearchitecture【发布时间】:2021-02-1021:59:13【问题描述】:我正在寻找一种基于SpringBoot微服务为我们的项目创建注册、身份验证和授权的最佳方法。微服务将为SPA应... 查看详情

微服务架构认证鉴权方案

...是其所声称的身份,检查该用户是否有访问该后台服务的权限。目前主流的认证鉴权方案有2种。第一种是引入Redis做分布式会话,即用户登录成功后,将用户身份、权限信息存入Redis,以一个唯一ID作为Key,并设置信息在Redis里的... 查看详情

springsecurity实现登陆认证授权(代码片段)

前端可以根据权限信息控制菜单和页面展示,操作按钮的显示。但这并不够,如果有人拿到了接口,绕过了页面直接操作数据,这是很危险的。所以我们需要在后端也加入权限控制,只有拥有操作权限,该接口才能被授权访问。... 查看详情

springboot技术专题「实战开发系列」带你一同探索shiro整合jwt授权和认证实战开发(代码片段)

本章介绍一下常用的认证框架Shiro结合springboot以及集合jwt快速带您开发完成一个认证框架机制。Maven配置依赖<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2 查看详情