Spring Cloud Security OAuth2.0 认证受权

世界上最快的捷径,就是脚踏实地,本文已收录【 架构技术专栏】关注这个喜欢分享的地方。

前序

最近想搞下基于Spring Cloud的认证受权平台,整体想法是能够对服务间受权,想作一个基于Agent 的无侵入的方式。redis

由于新版本的Spring Cloud Security 、 OAuth2.0 貌似改了些东西,说上网随便翻翻,但发现没有针对Spring Security OAuth2.0认证受权系统性的文章。数据库

遂结合一些资料和本身的一些梳理,来搞一个认证受权系列,就当是一个总结了。后端

其实前面我也搞了几个关于认证受权的文章,但总感受太零碎了,不成体系,没搞过 Security 、OAuth2.0、JWT的人会一脸懵逼。设计模式

此次准备再从头梳理下这方面的只是,逐步递进。尽可能不搞长篇大论,看的脑阔疼,争取一篇一个点的推动。安全

话很少说,饭要一口口吃,基础的东西其实也很重要,那就从头来讲吧。微信

基础概念

一、认证的概念

在这个移动时代,咱们天天都在各类APP间切换着,好比抖音、淘宝、微信等,好比咱们拿抖音来举例说明认证的一些基础概念。cookie

好比咱们在使用抖音前都须要进行注册吧,而后在输入用户名和密码(或验证码)来登陆帐号。session

这里登录的过程就是 认证架构

那为何要认证?前后端分离

认证,其实就是为了保护系统的资源,只有用户身份合法才能够访问资源。

认证 :用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信

息,身份合法方可继续访问,不合法则拒绝访问。

常见的用户身份认证方式有:

  • 用户名密码登陆
  • 二维码登陆
  • 手机短信登陆
  • 指纹认证
  • 人脸识别

二、会话的概念

你们想一想,若是我使用微信每点一个按钮都要我进行一次认证,那我岂不是要疯了。因此为了不这种问题,在用户认证完成后可将用户信息保存在会话中。

会话其实就是系统保留了当前用户登陆状态所提供的一种机制。

常见的会话方式:

  • 基于session
  • 基于token

基于session的认证方式:

一、用户认证成功,在服务端将用户信息保存在session中(目前不少为redis)

二、将sesssion_id返回给客户端并存入 cookie 中

客户端每次请求时带上session_id,服务端就会根据其进行用户合法性验证。当用户退出系统或session过时时,客户端的session_id也就失效了。

基于token的认证方式:

一、用户认证成功,在服务端会根据用户信息和某种加密手段生产一个token(如JWT)发给客户端

二、客户端将token存入 cookie 或 localStorage 中,在每次请求时带上token,服务端就能够根据token进行用户身份认证。服务端无需进行token存储,由于用户信息都包含在token中。

注意:

  • session的认证方式由Servlet规范定制,服务端需存储session,客户端须要支持 cookie(如不支持cookie就须要特殊处理)
  • token的认证方式不须要服务端存储token,而且不限制客户端的存储方式
  • 在现今的互联网时代,系统多为先后端分离的架构设计,因此基于token的方式更好点

三、受权的概念

咱们那微信来举例,当用户登录成功后就可使用发朋友圈、添加好友、发红包等功能。

但此时若是咱们没有绑卡,是没法使用发红包功能的,也就是说咱们没有发红包的权限。

只有绑定银行卡的用户才能够发红包,也就是说此时的用户拥有了发红包的权限。

这个根据用户的权限来控制用户使用资源的过程就是受权 。

为何要受权?

认证是为了确认用户的合法性,而受权是为了更细粒度的对数据进行划分,受权是发生在认证完成后的,用来控制不一样的用户访问不一样的资源。

受权: 受权是用户认证经过根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问,没有

权限则拒绝访问。

受权的数据模型

都知道写代码有设计模式,通过总结,受权也有其数据模型

其实也就是哪些用户,拥有哪些权限,能够访问哪些资源,以下图:

关于上图,咱们能够抽象出几个关键点:

who 对what 进行 how 操做

who : 用户

what: 资源

how: 权限

例如上面,用户02 能够对商品信息01 进行修改操做,其实这也是一种经典的受权方案,后面咱们再来细说

而后经过上图,能够抽象其中的关系,来帮助咱们落地数据库表设计,来一个经典的:

受权方案

如何实现受权的设计?其实业界有几种经常使用方案:

  • ACL 访问控制列表,表达和执行能力都较弱
  • RBAC 基于角色的权限控制,表达能力有所欠缺,只能表达正向的访问控制,反向控制较难
  • ABAC 基于属性的权限控制,能较好地表达反向访问控制,但执行能力较差
  • PBAC 基于策略的权限控制,结合了RBAC 和 ABAC 的最佳特性,它能实现更多应用场景复杂且灵活的管理控制需求

其中ABAC和PBAC在互联网场景中不多使用,ACL是直接关系,RBAC是间接关系,因此咱们来看下通常经常使用的RBAC

RBAC

RBAC权限模型(Role-Based Access Control), 基于角色的权限控制

在20世纪90年代期间,大量的专家学者和专门研究单位对RBAC的概念进行了深刻研究,前后提出了许多类型的RBAC模型,其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具备系统性,获得广泛的公认。

RBAC认为权限的过程能够抽象归纳为:判断【Who是否能够对What进行How的访问操做】这个逻辑表达式的值是否为True的求解过程。

RBAC模型的数据库建模

RBAC 将权限问题转换为Who、What、How的问题,其实根本就是用户经过角色进行权限关联。

一个用户能够拥有多个角色,一个角色又能够拥有多个权限。这样就构成了用户 - 角色 - 权限的受权模型。在模型中,用户和角色之间,角色和权限之间,通常是多对多关系,如图。

这里有个核心点,就是角色,能够理解为权限的集合体,是一种载体。好比论坛的版主、超级管理员等,版主能够管理对帖子进行管理,这就是权限。若是要给某个用户授予这些权限,只须要把角色赋予该用户就行了,而不须要和权限进行直接绑定。

进一步,增长权限组设计

而在实际应用过程当中会发现,当用户量很是大的时候,若是咱们要给每一个用户进行受权那真是累到手抽筋啊。因此,这时候就须要给用户分组,分组后咱们也能够直接给用户组进行受权。这时用户所拥有的权限,就是用户我的权限和用户组权限之和。

咱们来看看进化后的模型:

再进一步,增长页面功能权限设计

在咱们实现场景中,对功能模块的操做、菜单访问、按钮访问、文件上传等均可属于权限的范畴。

在有些权限设计中,会把功能操做做为一类,而把文件、菜单、页面元素等做为另外一类,这样构成“用户-角色-权限-资源”的受权模型。

在作数据表建模时,可把功能操做和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性

好比这里咱们有菜单、文件等功能,咱们来看下权限表更新后的设计:

这里有几个核心点说一下:

经过权限表的权限类型字段,咱们能够自有扩展本身的权限。好比MENU表明菜单权限、FILE表明文件权限,咱们在扩展时只须要建一张权限XXX关联表就能够了。

这里权限表、菜单表、权限菜单关联表是1对1的关系,因此若是新增一个菜单就须要同时在三张表内插入记录。在设计时也能够省去关联表,直接叫权限表和菜单表进行关联,只是须要在权限表内增长一个记录菜单ID的字段,方便后面进行区分。

好了,到目前为止,基于RBAC的权限模型设计就完成了,来一个完整的设计图

后序

本章节属于针对于基础概念作了些铺垫,RBAC属于重点内容,也属于咱们目前设计权限也会常常用到的一种模式。

至于RBAC的表设计,其实万变不离其宗,主要的仍是搞清楚who、what、how。至于具体怎么实现就看你的业务需求了,没有完美的设计,只有不停的迭代。

后续计划,大概说下

  • Spring Cloud Security 使用
  • 和OAuth2.0怎么结合
  • 分布式系统的认证方案
  • 基于Spring CloudSecurity 实现分布式认证受权

WechatIMG3262.png