统一用户认证和单点登录和授权的原理与流程

您所在的位置:网站首页 南审统一身份认证 统一用户认证和单点登录和授权的原理与流程

统一用户认证和单点登录和授权的原理与流程

2024-06-13 21:41| 来源: 网络整理| 查看: 265

统一用户认证和单点登录和授权的原理与流程 1 前言2 介绍2.1 统一用户认证2.2 单点登录2.3 授权 3 原理3.1 统一用户认证原理3.2 单点登录原理3.3 OAuth授权原理 4 OAuth 2.0的四种授权模式4.1 授权码授权模式流程(重点)4.2 授权码授权模式详细示例4.3 简化授权模式流程4.4 简化授权模式详细示例4.5 密码授权模式流程4.6 密码授权模式详细示例4.7 客户端授权模式流程4.8 客户端授权模式详细示例 5 OAuth 2.0单点登录5.1 同一企业内部多系统的单点登录示例5.2 不同企业之间多系统的单点登录示例5.3 比较 6 小结

1 前言

随着信息技术和网络技术的迅猛发展,大型企业内部的应用系统越来越多。比如在电商行业,常见的应用系统就有商品系统、订单系统、支付系统、物流系统、客服系统等等。这些系统互相独立,且每个系统都需要识别用户的身份,并根据用户的身份来进行权限控制。如果每个系统都各自实现用户管理和认证的功能,就会带来用户信息冗余、不同步等问题,也会导致用户必须记住每一个系统的用户名和密码,从而给用户带来不少麻烦。针对这些实际情况,统一用户认证、单点登录、授权等概念应运而生,而且被广泛应用到企业应用系统中。

本文主要介绍基于Spring Security + OAuth 2.0协议的统一用户认证、单点登录、授权的原理和流程。

2 介绍 2.1 统一用户认证

统一用户认证,就是判断一个用户是否为合法用户的过程。一般来说,大型企业内部的每个应用系统都需要识别用户的身份,如果每个系统都各自实现用户管理和认证的功能,那么对于企业而言,必定会增加用户信息的管理成本,也会导致多个系统之间的用户信息冗余且不同步的问题,对于用户而言,必须记住每个系统的账户信息,从而带来不便。例如,用户同时使用某个大型企业内部的10个应用系统,就必须在这10个应用系统中都创建自己的账户并记住账户,这样每个系统都需要管理用户的信息,而且一旦用户在某个系统中修改了信息,就会导致系统之间用户信息不一致的问题。万一系统的数量增加到50个、100个了?估计企业和用户都要疯了。

解决上述问题的根本方法是建立统一用户管理系统(UUMS)。UUMS统一存储、维护、管理所有应用系统的用户信息,所有系统的用户认证功能全部由UUMS来完成,而用户权限控制功能则由各个应用系统自己完成。可见、UUMS应具备以下基本功能:

统一用户管理:用户信息的存储、维护、管理等功能。统一用户认证:用户身份识别、角色分配等功能。

统一用户认证是以UUMS为基础,对所有的系统提供统一的认证方式和认证策略,以识别用户身份的合法性。

注意:统一用户认证是为了解决多个系统的用户管理和认证的问题。

2.2 单点登录

对于大型企业内部的多个应用系统而言,统一用户管理系统能够很好的解决用户信息冗余和不同步的问题,也能减轻用户需要创建并管理多个账户的痛苦,即使这样也仍然存在多个系统都需要用户登录的问题。例如,用户同时使用某个大型企业内部的10个应用系统,那么就需要用户使用同一个账号信息去分别登录每个系统,这样的操作必定会导致用户体验太差。单点登录就是为了解决这个问题而提出的。

单点登录(Single Sign On,简称SSO)是一种方便用户访问多个系统的技术,用户只需在一个系统中进行登录,就可以在多个系统间自由穿梭,不必重复输入用户名和密码来确定身份。

注意:单点登录是为了解决同一用户在使用多个系统时的重复登录的问题。

2.3 授权

我们经常会遇到这样一个问题:在访问某些系统(例如知乎、豆瓣),都需要用户先注册账号,然后登录才能继续访问,而很多用户却又嫌注册太麻烦,为了方便用户使用,这些系统都会提供使用第三方账号(例如微信账号)进行登录的方式。那么问题来了,如果用户直接将自己的第三方账号和密码告诉这些系统,那么又怎样确保这些系统不会泄露用户的账号信息以及私自获取用户在第三方系统中除用户账户之外的数据?“授权”就能很好的解决这个问题。

所谓“授权”,就是用户先授予某个系统可以使用自己的第三方账号信息的权利,然后该系统就可以使用用户的授权到第三方去获取该用户的账号信息,而第三方验证了用户的授权之后就按照用户授权的范围把用户允许的账号信息返回给该系统,而不会把用户没有允许的数据返回给该系统。这样一来,用户既可以访问这些系统,又不需要把自己的第三方账号信息告诉给这些系统,从而可以解决上述问题。

注意:授权是为了解决多个系统之间用户信息共享的问题。

3 原理 3.1 统一用户认证原理

统一用户认证的原理相对简单,基本都是判断当前正在操作的用户的账户是否存在且密码是否匹配。如果用户认证通过了,那么用户就可以使用预先设定的角色来进行操作了,至于该角色能够进行哪些操作,则由各个应用系统自己指定了。统一用户认证包括以下几种认证方式,这些认证方式采用模块化设计,可以根据需求而组合使用:

匿名认证方式:用户不需要任何认证,可以匿名的方式登录系统。用户名/密码认证:这是最基本的认证方式。PKI/CI数字证书认证:通过数字证书的方式认证用户的身份。IP地址认证:用户只能用指定的IP地址或IP地址段访问系统。时间段认证:用户只能在指定的时间段访问系统。访问次数认证:累计用户的访问次数,使用户的访问次数在一定的范围之内才可以访问系统。

Spring Security和Shiro是两种主流的统一用户认证框架。

3.2 单点登录原理

单点登录的原理就是:用户在使用多个应用系统时,当用户第一次访问任一应用系统时,会因为没有登录而被引导到用户认证系统中进行认证,如果认证通过,用户就会得到一个认证凭据——ticket,用户再访问其它应用系统时,就会带上这个ticket作为自己已认证的凭据,而其它应用系统校验ticket通过之后,用户就可以不需要再次认证就可以直接该其它应用系统了。

要实现单点登录,需要以下主要功能:

所有的应用系统共享一个用户认证系统:统一的认证系统是单点登录的前提之一。所有的应用系统能够识别和提取ticket信息:应用系统应该能对ticket进行识别和提取,从而判断当前用户是否已经认证,从而完成单点登录的功能。

单点登录的实现方案较多,有Spring Security + OAuth方案、Spring Security + CAS方案、Shiro + CAS方案,但Spring Security + OAuth方案更常用,本文讲解的单点登录也是基于这种方案。

3.3 OAuth授权原理

OAuth是一种授权协议,OAuth协议区分以下四种角色:

资源拥有者:即用户第三方应用:即客户端认证服务器:即服务提供商专门用来处理用户统一认证的服务器资源服务器:即服务提供商专门用来存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

OAuth 2.0支持四种授权模式:

授权码授权模式(Authorization Code Grant)简化授权模式(Implicit Grant)密码授权模式(Resource Owner Password Credentials Grant)客户端凭证授权模式(Client Credentials Grant) 4 OAuth 2.0的四种授权模式 4.1 授权码授权模式流程(重点)

授权码模式是最严格也是最重要的一种授权模式,其主要流程如下图所示: 在这里插入图片描述

用户访问:用户访问某个应用系统的客户端请求授权:客户端请求用户授权,允许自己获取和使用用户的特定信息数据同意授权:用户同意授权给客户端申请授权码:客户端使用用户的授权到服务提供商的认证服务器申请授权码发放授权码:认证服务器校验客户端使用的用户授权,校验通过则向客户端发放授权码申请令牌:客户端使用用户的授权到服务提供商的认证服务器申请令牌发放令牌:认证服务器校验客户端使用的用户授权,校验通过则向客户端发放令牌申请资源:客户端使用令牌到服务提供商的资源服务器申请用户的特定信息数据发放资源:资源服务器校验客户端使用的令牌,校验通过则将用户指定的用户信息数据发送给客户端

注意: 授权码授权模式既适用于同一企业的多个系统之间的授权,也适用于不同企业的多个系统之间的授权

4.2 授权码授权模式详细示例

这里以知乎客户端、微信认证服务器、微信资源服务器为例 ,这三个相互独立,其中认证服务器使用授权码模式对所有的微信用户进行认证,所有微信用户的数据全部保存在微信资源服务器中,而知乎客户端需要用户登录之后才能进行操作,那么用户使用微信授权知乎客户端进行操作的完整流程如下图所示: 在这里插入图片描述

用户访问:用户在未登录知乎客户端的情况下,点击知乎客户端中的链接发送请求请求授权:知乎客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向微信认证服务器进行认证并授权同意授权:用户在微信认证服务器中输入微信账号信息进行认证,并进行授权发放授权码:微信认证服务器验证用户微信账号的合法性和是否授权,如果用户账号合法且确定授权,则将授权码发送给知乎客户端申请令牌:知乎客户端收到授权码后,使用收到的授权码到微信认证服务器换取令牌发放令牌:微信认证服务器验证知乎客户端发送过来的授权码的正确性,如果通过,则将令牌发送给知乎客户端申请资源:知乎客户端收到令牌后,使用收到的令牌到微信资源服务器获取用户微信账号的指定信息发放资源:微信资源服务器验证知乎客户端发送过来的令牌的正确性,如果通过,则将用户微信账号的指定信息数据发送给知乎客户端解析登录:知乎客户端收到用户微信账号的指定信息后解析并登录知乎客户端展示数据:知乎客户端从知乎后台获取数据并展示给用户(这里涉及多步操作,省略) 4.3 简化授权模式流程

简化授权模式流程较授权码授权模式少了授权码这一环节,因此叫简化授权模式,其主要流程如下图所示: 在这里插入图片描述

用户访问:用户访问某个应用系统的客户端请求授权:客户端请求用户授权,允许自己获取和使用用户的特定信息数据同意授权:用户同意授权给客户端申请令牌:客户端使用用户的授权到服务提供商的认证服务器申请令牌发放令牌:认证服务器校验客户端使用的用户授权,校验通过则向客户端发放令牌申请资源:客户端使用令牌到服务提供商的资源服务器申请用户的特定信息数据发放资源:资源服务器校验客户端使用的令牌,校验通过则将用户指定的用户信息数据发送给客户端

注意: 简化授权模式既适用于同一企业的多个系统之间的授权,也适用于不同企业的多个系统之间的授权

4.4 简化授权模式详细示例

这里以知乎客户端、微信认证服务器、微信资源服务器为例 ,这三个相互独立,其中认证服务器使用简化模式对所有的微信用户进行认证,所有微信用户的数据全部保存在微信资源服务器中,而知乎客户端需要用户登录之后才能进行操作,那么用户使用微信授权知乎客户端进行操作的完整流程如下图所示: 在这里插入图片描述

用户访问:用户在未登录知乎客户端的情况下,点击知乎客户端中的链接发送请求请求授权:知乎客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向微信认证服务器进行认证并授权同意授权:用户在微信认证服务器中输入微信账号信息进行认证,并进行授权发放令牌:微信认证服务器验证用户微信账号的合法性和是否授权,如果用户账号合法且确定授权,则将令牌发送给知乎客户端申请资源:知乎客户端收到令牌后,使用收到的令牌到微信资源服务器获取用户微信账号的指定信息发放资源:微信资源服务器验证知乎客户端发送过来的令牌的正确性,如果通过,则将用户微信账号的指定信息数据发送给知乎客户端解析登录:知乎客户端收到用户微信账号的指定信息后解析并登录知乎客户端展示数据:知乎客户端从知乎后台获取数据并展示给用户(这里涉及多步操作,省略) 4.5 密码授权模式流程

密码授权模式要慎重使用,因为用户需要直接将账号和密码等敏感信息提供给客户端,除非客户端是整个系统的一部分,或者是值得信赖的第三方系统,才可以考虑这种授权方式。其主要流程如下图所示: 在这里插入图片描述

用户访问:用户访问某个应用系统的客户端要求登录:客户端要求用户登录提供账户:用户向客户端提供账号和密码进行登录申请令牌:客户端使用用户的账号和密码到服务提供商的认证服务器申请令牌发放令牌:认证服务器校验客户端使用的用户授权,校验通过则向客户端发放令牌申请资源:客户端使用令牌到服务提供商的资源服务器申请用户的特定信息数据发放资源:资源服务器校验客户端使用的令牌,校验通过则将用户指定的用户信息数据发送给客户端

注意: 密码授权模式主要适用于客户端属于系统的一部分的情况

4.6 密码授权模式详细示例

这里以新浪微博客户端、新浪微博认证服务器、新浪微博资源服务器为例 ,这三个共同组成新浪微博系统,其中认证服务器使用密码模式对所有的新浪微博用户进行认证,所有新浪微博用户的数据全部保存在新浪微博资源服务器中,而新浪微博客户端需要用户登录之后才能进行操作,那么用户使用新浪微博客户端进行操作的完整流程如下图所示: 在这里插入图片描述

用户访问:用户在未登录新浪微博客户端的情况下,点击新浪微博客户端中的链接发送请求请求登录:新浪微博客户端发现用户点击的是需要登录才能访问的链接,于是将用户导新浪微博客户端的登录页面进行登录用户登录:用户在新浪微博客户端的登录页面输入新浪微博账号信息进行登录(登录成功即授权成功)申请令牌:新浪微博客户端将用户输入的新浪微博账号信息发送到新浪微博认证服务器进行用户认证发送令牌:新浪微博认证服务器验证新浪微博客户端发送过来的用户新浪微博账号的合法性,如果用户账号合法,则将令牌发送给新浪微博客户端申请资源:新浪微博客户端收到令牌后,使用收到的令牌到新浪微博资源服务器获取用户新浪微博账号信息发送资源:新浪微博资源服务器验证新浪微博客户端发送过来的令牌的正确性,如果通过,则将用户新浪微博账号信息数据发送给新浪微博客户端解析登录:新浪微博客户端收到用户新浪微博账号信息后解析并登录新浪微博客户端展示数据:新浪微博客户端从新浪微博资源服务器获取用户请求的数据并展示给用户(这里涉及多步操作,省略) 4.7 客户端授权模式流程

这种授权模式比较特殊,客户端不是以用户的名义向认证服务器申请令牌,而是以自己的名义向认证服务器申请令牌,因此,这种授权模式其它与用户没有任何关系。其主要流程如下图所示: 在这里插入图片描述

用户访问:用户访问某个应用系统的客户端申请令牌:客户端使用自己的名义到服务提供商的认证服务器申请令牌发放令牌:认证服务器校验客户端是否是合法的指定客户端,校验通过则向客户端发放令牌申请资源:客户端使用令牌到服务提供商的资源服务器申请数据资源发放资源:资源服务器校验客户端使用的令牌,校验通过则将客户端申请的数据资源发送给客户端

注意: 客户端授权模式主要适用于客户端和系统之间默认存在信任关系的情况

4.8 客户端授权模式详细示例

这里以市天气系统客户端、省天气系统认证服务器、省天气系统资源服务器为例 ,其中省天气系统认证服务器使用客户端模式对所有的市天气系统客户端进行认证,该省所有市的的天气数据全部保存在省天气系统资源服务器中,那么用户使用市天气系统客户端查看当市天气的完整流程如下图所示: 在这里插入图片描述

用户请求:用户在市天气系统客户端中点击链接,请求查看当市天气申请令牌:市天气系统客户端将自己的凭证发送给省天气系统认证服务器进行身份认证发放令牌:省天气系统认证服务器验证市天气系统客户端发送过来的凭证的合法性,如果凭证合法,则将令牌发送给市天气系统客户端申请资源:市天气系统客户端收到令牌后,使用收到的令牌到省天气系统资源服务器获取当市天气发放资源:省天气系统资源服务器验证市天气系统客户端发送过来的令牌的正确性,如果通过,则将该市天气数据发送给市天气系统客户端展示数据:市天气系统客户端将收到的数据展示给用户 5 OAuth 2.0单点登录

单点登录是指在使用多个系统时,只需一次登录就可以使用所有系统,可见,单点登录是针对多个系统而言的,而这多个系统,可能同属于某一个企业(或机构),也可能分别属于不同的企业(或机构),而从2.2小节可知,单点登录的前提是统一用户认证,因此,单点登录主要是结合授权码授权和简单授权这两模式使用。以下两个示例则以授权码授权模式展示两个系统的单点登录流程,多个系统的单点登录流程依此类推。

5.1 同一企业内部多系统的单点登录示例

这里以淘宝客户端、天猫客户端、阿里巴巴认证服务器、阿里巴巴资源服务器为例 ,这四个相互独立但同属于阿里巴巴集团,其中认证服务器使用授权码模式对所有的阿里巴巴用户进行认证,所有阿里巴巴用户的数据全部保存在阿里巴巴资源服务器中,而淘宝客户端和天猫客户端需要用户登录之后才能进行操作,那么阿里巴巴用户基于单点登录使用淘宝客户端和天猫客户端进行操作的完整流程如下图所示: 在这里插入图片描述

用户访问:用户在未登录淘宝客户端的情况下,点击淘宝客户端中的链接发送请求请求认证:淘宝客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向阿里巴巴认证服务器进行认证用户认证:用户在阿里巴巴认证服务器中输入账号信息进行认证(认证通过即授权成功)发放授权码:阿里巴巴认证服务器验证用户账号的合法性,如果账号合法,则将授权码发送给淘宝客户端申请令牌:淘宝客户端收到授权码后,使用收到的授权码到阿里巴巴认证服务器换取令牌发放令牌:阿里巴巴认证服务器验证淘宝客户端发送过来的授权码的正确性,如果通过,则将令牌发送给淘宝客户端申请资源:淘宝客户端收到令牌后,使用收到的令牌到阿里巴巴资源服务器获取用户账号信息发放资源:阿里巴巴资源服务器验证淘宝客户端发送过来的令牌的正确性,如果通过,则将用户账号信息数据发送给淘宝客户端解析登录:淘宝客户端收到用户账号信息后解析并登录淘宝客户端展示数据:淘宝客户端从阿里巴巴资源服务器获取用户请求所需要的数据并展示给用户(这里涉及多步操作,省略) ——————————————————————————————————————————————用户访问:随后用户在未登录天猫客户端的情况下,点击天猫客户端中的链接发送请求请求认证:天猫客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向阿里巴巴认证服务器进行认证发放授权码:阿里巴巴认证服务器发现用户已经认证,因此直接将授权码发送给天猫客户端申请令牌:天猫客户端收到授权码后,使用收到的授权码到阿里巴巴认证服务器换取令牌发放令牌:阿里巴巴认证服务器验证天猫客户端发送过来的授权码的正确性,如果通过,则将令牌发送给天猫客户端申请资源:天猫客户端收到令牌后,使用收到的令牌到阿时巴巴资源服务器获取用户账号信息发放资源:阿里巴巴资源服务器验证天猫客户端发送过来的令牌的正确性,如果通过,则将用户账号信息数据发送给天猫客户端解析登录:天猫客户端收到用户账号信息后解析并登录天猫客户端展示数据:天猫客户端从阿里巴巴资源服务器获取用户请求所需要的数据并展示给用户 5.2 不同企业之间多系统的单点登录示例

这里以知乎客户端、豆瓣客户端、微信认证服务器、微信资源服务器为例 ,这四个相互独立,但分别属于三个企业,其中微信认证服务器使用授权码模式对所有的微信用户进行认证,所有微信用户的数据全部保存在微信资源服务器中,而知乎客户端和豆瓣客户端需要用户登录之后才能进行操作,那么微信用户基于单点登录使用知乎客户端和豆瓣客户端进行操作的完整流程如下图所示: 在这里插入图片描述

用户访问:用户在未登录知乎客户端的情况下,点击知乎客户端中的链接发送请求请求授权:知乎客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向微信认证服务器进行认证并授权认证并授权:用户在微信认证服务器中输入微信账号信息进行认证,并进行授权发放授权码:微信认证服务器验证用户微信账号的合法性和用户是否授权,如果账号合法且确定授权,则将授权码发送给知乎客户端申请令牌:知乎客户端收到授权码后,使用收到的授权码到微信认证服务器换取令牌发放令牌:微信认证服务器验证知乎客户端发送过来的授权码的正确性,如果通过,则将令牌发送给知乎客户端申请资源:知乎客户端收到令牌后,使用收到的令牌到微信资源服务器获取用户微信账号的指定信息发放资源:微信资源服务器验证知乎客户端发送过来的令牌的正确性,如果通过,则将用户微信账号的指定信息数据发送给知乎客户端解析登录:知乎客户端收到用户微信账号的指定信息后解析并登录知乎客户端展示数据:知乎客户端从知乎后台获取用户请求所需要的数据并展示给用户(这里涉及多步操作,省略) ——————————————————————————————————————————————用户访问:随后用户在未登录豆瓣的情况下,点击豆瓣客户端中的链接发送请求请求授权:豆瓣客户端发现用户点击的是需要登录才能访问的链接,于是将用户导向微信认证服务器进行认证并授权授权:此时用户在微信认证服务器中已经认证,因此,用户只需要进行授权发放授权码:微信认证服务器验证用户是否授权,如果确定授权,则将授权码发送给豆瓣客户端申请令牌:豆瓣客户端收到授权码后,使用收到的授权码到微信认证服务器换取令牌发放令牌:微信认证服务器验证豆瓣客户端发送过来的授权码的正确性,如果通过,则将令牌发送给豆瓣客户端申请资源:豆瓣客户端收到令牌后,使用收到的令牌到微信资源服务器获取用户微信账号的指定信息发放资源:微信资源服务器验证豆瓣客户端发送过来的令牌的正确性,如果通过,则将用户微信账号的指定信息数据发送给豆瓣客户端解析登录:豆瓣客户端收到用户微信账号的指定信息后解析并登录豆瓣客户端展示数据:豆瓣客户端从豆瓣后台获取用户请求所需要的数据并展示给用户(这里涉及多步操作,省略) 5.3 比较

从上述两个单点登录的示例可以看出,同一企业内部多系统的单点登录与不同企业之间多系统的单点登录的流程基本相同,不同的是:同一企业内部多系统的单点登录流程中,只需要用户在首次使用系统时进行用户认证,且认证成功即默认为确定授权,而随后使用其它系统时都不需要再进行认证和授权;而不同企业内部多系统的单点登录流程中,用户在首次使用系统时不仅需要进行用户认证,还要进行授权,而随后使用其它系统时虽然不需要再进行认证,但仍需要再次授权。

6 小结

至此,用户统一认证、单点登录、授权的原理与详细流程就全部介绍完成,欢迎聪明的Java猿们留言补充讨论。

如果觉得本文对您有帮助,请关注博主的微信公众号,会经常分享一些Java和大数据方面的技术案例! 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3