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

前序

最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无侵入的方式。

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

遂结合一些资料和自己的一些梳理,来搞一个认证授权系列,就当是一个总结了。

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

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

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

基础概念

1、认证的概念

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

比如我们在使用抖音前都需要进行注册吧,然后在输入用户名和密码(或验证码)来登录账号。

这里登陆的过程就是 认证

那为什么要认证?

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

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

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

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

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

2、会话的概念

大家想想,如果我使用微信每点一个按钮都要我进行一次认证,那我岂不是要疯了。所以为了避免这种问题,在用户认证完成后可将用户信息保存在会话中。

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

常见的会话方式:

  • 基于session
  • 基于token

基于session的认证方式:

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

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

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

基于token的认证方式:

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

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

注意:

  • session的认证方式由Servlet规范定制,服务端需存储session,客户端需要支持 cookie(如不支持cookie就需要特殊处理)

  • token的认证方式不需要服务端存储token,并且不限制客户端的存储方式

  • 在现今的互联网时代,系统多为前后端分离的架构设计,所以基于token的方式更好点

3、授权的概念

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

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

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

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

**为什么要授权? **

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

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

权限则拒绝访问。

授权的数据模型

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

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

关于上图,我们可以抽象出几个关键点:

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 实现分布式认证授权

Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念的更多相关文章

  1. Spring Security OAuth2.0认证授权四:分布式系统认证授权

    Spring Security OAuth2.0认证授权系列文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授 ...

  2. Spring Security OAuth2.0认证授权二:搭建资源服务

    在上一篇文章[Spring Security OAuth2.0认证授权一:框架搭建和认证测试](https://www.cnblogs.com/kuangdaoyizhimei/p/14250374. ...

  3. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  4. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  5. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  6. Spring Security OAuth2.0认证授权一:框架搭建和认证测试

    一.OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容. 1.s ...

  7. Spring security OAuth2.0认证授权学习第三天(认证流程)

    本来之前打算把第三天写基于Session认证授权的,但是后来视屏看完后感觉意义不大,而且内容简单,就不单独写成文章了; 简单说一下吧,就是通过Servlet的SessionApi 通过实现拦截器的前置 ...

  8. Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)

    基础的授权其实只有两行代码就不单独写一个篇章了; 这两行就是上一章demo的权限判断; 集成SpringBoot SpringBoot介绍 这个篇章主要是讲SpringSecurity的,Spring ...

  9. Spring security OAuth2.0认证授权学习第一天(基础概念-认证授权会话)

    这段时间没有学习,可能是因为最近工作比较忙,每天回来都晚上11点多了,但是还是要学习的,进过和我的领导确认,在当前公司的技术架构方面,将持续使用Spring security,暂不做Shiro的考虑, ...

随机推荐

  1. rabbitmq与erlang版本

    来源自https://www.rabbitmq.com/which-erlang.html erlang安装包下载地址 https://packages.erlang-solutions.com/er ...

  2. springboot集成spring security(一)

    一,添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  3. 两个有序数列找第k小

    给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2  两个有序数组 找第k小 * 方案一 合并遍历 * 二:游 ...

  4. idea2019注册码,亲测可用(暂时不可用)!

    原文链接:https://www.jianshu.com/p/702deab2447c 注册码: MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGlj ...

  5. Java安全之安全加密算法

    Java安全之安全加密算法 0x00 前言 本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多.了解的层次只是基于加密算法的一些应用上.也来浅谈一下加密算法在安全领域中的作用.写 ...

  6. STM32移植FreeRTOS(1)

    "STM32F103VET6<_>FreeRTOS" 1.项目功能实现 1)LED灯定时闪烁 2)KEY按键检测 3)FreeRTOS任务创建 4)串口输出程序运行状态 ...

  7. [Luogu P2891/POJ 3281/USACO07OPEN ]吃饭Dining

    传送门:https://www.luogu.org/problemnew/show/P2891 题面 \ Solution 网络流 先引用一句真理:网络流最重要的就是建模 今天这道题让我深有体会 首先 ...

  8. 如何使用捷映App制作朋友圈九宫格视频图片合集

    在刷朋友圈的过程中,看到九宫格的视频图片合集,带有酷炫的音效和动效,展现效果非常好,那么我们该如何制作呢?下面我为大家介绍. 第一步,我们需要在各大应用市场搜索[捷映视频制作]App,点击[安装]. ...

  9. .NetCore中简单使用EasyNetQ

    前言 我们在.Net中使用RabbitMQ,最原始的就是基于RabbitMQ.Client进行编码,在这个过程中我们需要通过代码约定和维护队列,Exchange等.如果是自行编码封装通用型的Rabbi ...

  10. Java入门(3)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 在程序中使用字符值时,必须用单引号将赋给变量的字符值括起来,对于字符串必须用双引号括起来. int整型-2.14*10^9~2.14*10 ...