名词
- OAuth 2:除非有“标准”、“协议”等特别说明,例如:OAuth 2 标准或 OAuth 2 协议,否则本文中的 OAuth 2 均指代的是
Spring Security OAuth2
、Spring Authorization Server
等 OAuth 2 协议的具体实现组件或框架。 - Spring Security 生态:在本文中为了表述方便,“Spring Security 生态”指代的是
Spring Security
、Spring Security OAuth2
、Spring Authorization Server
、Spring Security OAuth2 Client
等一系列 Spring 生态安全相关组件或框架。
概述
OAuth 全称是 Open Authentication
。大家都知道 OAuth 是一个开放标准,但是除此以外似乎找不到一个非常准确的而且容易理解的 OAuth 定义。在网络中能够搜索到的 OAuth 的定义,基本都是来源于网络各文章作者自己对 OAuth 的理解。
为此,特别选择了一个笔者本人认为相对来说更容易理解的一个定义,具体如下:
开放授权( OAuth )是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
OAuth 主要有 OAuth 1.0 和 OAuth 2.0 两个版本,并且二者完全不同,且不兼容。OAuth 2.0 是目前广泛使用的版本,我们多数谈论 OAuth 时,一般都是指的 OAuth 2.0 版本。随着Spring Authorization Server
逐步普及, OAuth 2.1 版本也逐步地进入了大众的视野。
这里为什么要提及 OAuth 的定义?请注意定义中的关键词“第三方应用”,这个词对于理解后续内容有着至关重要的作用。
笔者认为使用 OAuth 2 最大的难点,是对 OAuth 2 中各种术语以及概念的理解——这里所说的“理解”,指的不仅仅是对概念字面意思的理解,而是对其真正“含义”的理解。能否真正理解这些术语以及概念的“含义”,会直接影响使用 OAuth 2 的系统设计及实现,甚至影响整个系统的安全保障能力。
OAuth 2 中最为特殊的概念就是 Scope
。单独来看 Scope
其实并不难理解,但因为 Spring Security
生态组件中不仅有 Scope
概念还提供了Role
概念。在此基础之上,如果再加上 RBAC
权限模型,那么就会让 OAuth 2 的相关概念变得难以理解。
OAuth 2 中 Scope
和 Role
关系和区别到底是什么?在实际设计过程中,如何应用和处理 Scope
与 Role
关系?就成为使用 OAuth2 的关键技术难点之一。
本篇文章,旨在根据笔者个人经验和理解,结合 Dante Cloud 实际应用,深入解析 OAuth 2 中 Scope
和 Role
的概念及应用方法。
OAuth 2 与 Spring Security 关系
OAuth 2 是一种协议,所以实现的方式、组件、产品多种多样。文中的 OAuth 2,指代的是Spring Security OAuth2
或Spring Authorization Security
等 Spring 生态中的 OAuth 2 实现。后续部分内容中,也会沿用这种表述方式仅是为了方便,请各位读者注意语境的切换。
OAuth 是一个授权协议,OAuth 框架能让“第三方应用”以优先的权限访问 HTTP 服务。作为一个授权框架,OAuth 关注是如何让一个系统组件获取对另一个系统组件的访问权限。
OAuth 不是身份认证协议,虽然可以使用它构建具有身份认证功能系统,并且 OAuth 自身在多个地方也使用了身份认证(最典型的就是资源拥有者和客户端软件软件要想授权服务器进行身份认证),但这种内嵌身份认证的行为并不会将 OAuth 自身转变成身份认证协议。
正因为 OAuth 不是身份认证协议,所以身份认证和鉴权功能要基于其它组件来实现。使用 Spring Security OAuth2
或 Spring Authorization Server
实现 OAuth 2 授权服务器,首选的身份认证和鉴权组件就是 Spring Security
。
这一点对于理解基于 Spring Security
生态组件以及微服务架构的设计、实现也非常重要。
小结一下:
- OAuth 2 是一个授权协议,不具备认证、鉴权能力。注意:这里的授权与 RBAC 中为用户角色分配权限的那种“授权”不同。
Spring Security OAuth2
或Spring Authorization Server
实现的基于 OAuth 2 协议的授权服务器只负责“授权”,用户的身份认证和鉴权等均由Spring Security
负责实现。
那么,Spring Security OAuth2
或 Spring Authorization Server
是如何与 Spring Security
关联起来的?最终形成一套既包含授权功能,又包含认证和鉴权功能的完整的系统的呢?暂且,我们先抛开代码层面整合的“物理”实现关系,只从整合实现的“逻辑”实现关系思考,关键的因素就是:包含权限信息的 ”用户身份“(详情会在更多内容中详细解析)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。