• ABAC授权模型

    • 常用的授权模型

    • ABAC的访问控制

    • 表达式语言

    • SpEL性能

  • ABAC实践

    • crud代码

    • security上下文

    • 数据库设计

    • java程序

    • 测试类

  • Spring Security 和 Apache Shiro整合

最近有点无聊,以至于我很已经很久没有写出高质量的博客,为了挽回自己的这种无聊感打算手撕一下ABAC模型,毕竟RBAC模型五张基础表玩来玩去也玩不出来多少火花了,整理一下ABAC模型的实现也让这个周末更有意义一点。

  • 第一章ABAC授权模型是为了让大家先理解何为ABAC。

  • 第二章ABAC实践是对ABAC模型的代码实现。

  • 第三章简单的描述了一下如何整合进Spring Security 或者 Apache Shiro。

ABAC授权模型

基于属性的访问控制(ABAC)- 阿里云IDaaS:

  • https://help.aliyun.com/document_detail/174235.html

ABAC- 百度百科:

  • https://baike.baidu.com/item/abac/3555041?fr=aladdin

个人觉得这两篇文章已经完美描述了ABAC模型的原理

常用的授权模型

此节摘自基于属性的访问控制(ABAC)- 阿里云IDaaS

  • ACL(Access Control List)

在ACL中,包含用户、资源、资源操作 三个关键要素。通过将资源以及资源操作授权给用户而使用户获取对资源进行操作的权限。

  • RBAC(Role-Based Access Control )

是把用户按角色进行归类,通过用户的角色来确定用户能否针对某项资源进行某项操作。RBAC相对于ACL最大的优势就是它简化了用户与权限的管理,通过对用户进行分类,使得角色与权限关联起来,而用户与权限变成了间接关联。

  • ABAC(Attribute Base Access Control)

基于属性的权限控制不同于常见的将用户通过某种方式关联到权限的方式,ABAC则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。

属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性,所以理论上能够实现非常灵活的权限控制,几乎能满足所有类型的需求。

ABAC的访问控制

基于ABAC访问控制需要动态计算实体的属性、操作类型、相关的环境来控制是否有对操作对象的权限,所以在设计的时候需要考虑的条件判断的灵活性、通用性、易用性,用户只需要通过web页面即可配置授权,这需要减少硬编码似得逻辑变得简单通用,那么这需要满足一些运算符来实现。

类型 运算符
算术运算符 +, -, *, /, %, ^, div, mod
关系运算符 <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge
逻辑运算符 and, or, not, &&,   ||, !
条件 ?:

使用场景

用户只需要配置 user.age > 20 的条件即可获得特定的权限。

表达式语言

正如上一节所说的需要对某种条件进行解析那么就需要表达式语言,这让我想起了Spring Framework@Value注解和MyBatis<if test=“”>

// 相信很多 Java boy都使用过的吧
@Value("A?B:C")
private String A;
<select id = "XXX"><if test="user != null">XXXX</if>
</select>

看到这里大家应该大致猜到了ABAC的的核心就是Expression Language(EL),虽然上面的代码演示是使用Java生态作为演示,但是可以大胆的相信其他的编程语言都是有着自己的EL框架的。

java EL框架列表

  • spring-expression

  • OGNL

  • MVEL

  • JBoss EL

这里就不一一列举了感兴趣可以查看 Java EL生态排名:

https://mvnrepository.com/open-source/expression-languages

SpEL性能

Spring Expression Language (SpEL)官方文档:

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions

Spring官方文档摘取 翻译

Spring Framework 4.1 包含一个基本的表达式编译器。表达式通常被解释,这在评估期间提供了很多动态灵活性,但没有提供最佳性能。对于偶尔的表达式使用,这很好,但是,当由其他组件(如 Spring Integration)使用时,性能可能非常重要,并且没有真正需要动态性。

SpEL 编译器旨在满足这一需求。在求值期间,编译器生成一个 Java 类,它体现了运行时的表达式行为,并使用该类来实现更快的表达式求值。由于缺少表达式周围的类型,编译器在执行编译时使用在表达式的解释评估期间收集的信息。例如,它不能纯粹从表达式中知道属性引用的类型,但在第一次解释评估期间,它会找出它是什么。当然,如果各种表达式元素的类型随时间发生变化,基于此类派生信息进行编译可能会在以后造成麻烦。出于这个原因,编译最适合其类型信息在重复计算时不会改变的表达式。

考虑以下基本表达式:

someArray[0].someProperty.someOtherProperty < 0.1

由于前面的表达式涉及数组访问、某些属性取消引用和数字操作,因此性能提升非常显着。在一个运行 50000 次迭代的微型基准测试示例中,使用解释器评估需要 75 毫秒,使用表达式的编译版本仅需要 3 毫秒。

有关SpEL的性能Spring官方描述说SpEL的性能很棒(个人感觉Spring对自己的测试结果是不是少打了一个0啊,3ms的时间有点无法理解)

ABAC实践

本章仅实现ABAC的原理,不会对Spring Security和 Apache Shiro做任何的集成

因为笔者本人是一位Spring boy,所以工程项目会以Spring Boot框架作为基础,使用其它编程语言的同学可能需要受苦一下了

复杂场景下的权限系统该怎么玩?ABAC权限模型帮你搞定它!相关推荐

  1. 高并发场景下创建多少线程才合适?一条公式帮你搞定!!

    来自:冰河技术 创建多少线程合适, 要看多线程具体的应用场景.一般来说,我们可以将程序分为:CPU密集型程序和I/O密集型程序, 而针对于CPU密集型程序和I/O密集型程序,其计算最佳线程数的方法是不 ...

  2. Win10系统提示过期,三条命令帮你搞定

    很感谢华枚和贺信小盆友,自己的电脑用着用着提示到期了. 解决只需三条命令,前提我的电脑是Win10企业版的哦 slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmg ...

  3. 搜索推荐业务场景下的特征系统搭建

    转载:https://zhuanlan.zhihu.com/p/79874983?utm_source=wechat_session 前提:前阵子受朋友的邀约,结合自己在推荐搜索系统下的经验,对企业级 ...

  4. .NET Core微服务 权限系统+工作流(一)权限系统

    一.前言 实际上权限系统老早之前我就在一直开发,大概在刚毕业没多久就想一个人写一个系统,断断续续一直坚持到现在,毕竟自己亲动手自写的系统才有收获,本篇仅介绍权限. 小小系统上不了台面,望各位大神勿喷. ...

  5. Ubuntu:Ubuntu系统下在pycharm软件内配置anaconda环境(一张图轻松搞定!)

    Ubuntu:Ubuntu系统下在pycharm软件内配置anaconda环境(一张图轻松搞定!) 目录 Ubuntu系统下在pycharm软件内配置anaconda环境 Ubuntu系统下在pych ...

  6. 开机进不了windows系统_进系统就黑屏?键盘+注册表就搞定

    进系统就黑屏?键盘+注册表就搞定! 一般Windows系统要是有什么问题,只要能进得去,基本上都可以解决.如果进不了Windows,只要电脑硬件没问题,有个U盘什么的,也一样能处理.经常帮同事.朋友修 ...

  7. a类不确定度计算器_统统帮您搞定:LIMS系统,换版、内审、期间核查、不确定度、数据分析…………...

    CNAS实验室认可ISO17025三年的过渡期,所有获认可实验室应在2020年11月30日前完成新版CL01的转换工作.实验室转换工作的完成以取得依据ISO/IEC17025:2017颁发的认可证书为 ...

  8. mysql权限系统的工作原理_Mysql权限系统工作原理

    MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限. MyS ...

  9. mysql权限系统的工作原理_Mysql权限系统工作原理_PHP教程

    权限系统工作原理 MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来 ...

最新文章

  1. 数据库中的字段varchar类型和char类型的区别?
  2. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  3. 独家 | 使用深度神经网络在Oculus Quest上进行准确的手部追踪
  4. python常见问题
  5. Imageloader1-总体简介
  6. 关于流控器件和压控器件
  7. 使用fetch封装ajax_如何使用Fetch在JavaScript中进行AJAX调用
  8. 国家邮政局:对刷单、贩卖快递盲盒等进行清理整顿
  9. ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield
  10. python自学-Python 应该怎么学?
  11. .Net 数据缓存浅析
  12. GPU算力时代的新场景
  13. 比色皿洗涤不干净会造成很大实验误差
  14. 新中大财务软件-A3中怎样更改IP地址
  15. 一文告诉你 K8s PR (Pull Request) 怎样才能被 merge?
  16. GDB调试总结和实例
  17. SV806 QT UI开发
  18. 计算机知识与技能竞赛配图,“高教杯”全国大学生先进制图技术与技能大赛
  19. Windows 7 下载
  20. c语言知识地图,【程序设计论文】C语言程序设计翻转课堂研究(共3546字)

热门文章

  1. php围棋源码,腾讯围棋AI技术 PhoenixGo 正式开源,源码、模型全公开
  2. 情人节送ta一朵独一无二的玫瑰花
  3. 设计模式 -- 面向对象设计原则、黑箱/白箱复用
  4. springboot自动创建Oracle,一键生成项目 SpringBoot项目代码生成器 支持Oracle 支持MySql...
  5. 3D动画概述暨骨骼动画实现
  6. amoled led 排列_为何AMOLED屏幕不用RGB排列?
  7. java中jam_Jam的计数法 (Java代码)
  8. kankan including About CE
  9. 转:一个硕士应届生的面试总结.(很精彩,特别是具体的各公司面试信息)
  10. Nginx-Lua-FastDFS-GraphicsMagick动态图片缩略图