ABAC模型简单介绍——通过casbin进行简单举例

ABAC模型简单介绍——通过casbin进行简单举例

文章目录

  • ABAC模型简单介绍——通过casbin进行简单举例
    • 定义
    • 相关术语
    • Casbin实现ABAC(Python版)
        • 假设情境
        • 定义对象
        • 定义静态模型模板
        • 测试代码
        • 最终结果
    • 相关链接

定义

Attribute Based Access Control (基于属性的访问控制 ),简称ABAC,通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能够实现非常灵活的权限控制,几乎能满足所有类型的需求。

RBAC 在很多时候是管用的,比如我们的系统是面向销售公司或者学校这种组织架构很严整的地方,但是在复杂场景下,RBAC 渐渐就不够用了,它会产生很多虚无的 role 而且在管理和控制上更难:在某个医疗机构中,我们想要控制一个科室内,护士只能访问自己所负责的病人资料时,我们就无法直接使用 nurse 这个 role,我们需要更细粒度的 role 去划分病人老张还是老王,这就会产生和现实不对应的 role,例如:老张的护士,老王的护士。在医院这种病人流动性很大的场景下,频繁的创建和销毁 role 是很容易出问题,我们的确要求很频繁,但是与现实不 match 的虚无的 role 很难管理。

另一种情况是,如果管理者考虑医疗数据的安全性与隐私性,不希望护士在离开医院后能够访问到病人资料,我们会更加难办,常见的策略要么是在底层网络层进行处理,直接禁止在院外的一切访问,但是很多企业的需求往往是,使用 VPN 我依旧可以访问内部的资源,但是我还是希望基于所在地进行精确的控制,比如看邮件是可以的,但是看财务数据是不行的。在 RBAC 下,我们也可以通过虚拟的 role 来控制,比如下班后给与其 Out of Office 的 role,然后给与这个 role 最小的权限,这自然又需要虚拟的 role 与大量的动态控制。

例如规则:“允许所有班主任在上课时间自由进出校门”这条规则,其中,“班主任”是用户的角色属性,“上课时间”是环境属性,“进出”是操作属性,而“校门”就是对象属性了。为了实现便捷的规则设置和规则判断执行,ABAC通常有配置文件(XML、YAML等)或DSL配合规则解析引擎使用。

相关术语

Attribute:属性,用于表示实体特点

Subject:代指使用系统的人活着其他使用者

Object:需要管理的资源,resource

Operation:读、写、修改、拷贝等操作

Policy:通过subject、object的attribute与environment conditions一起来判断subject请求是否能够允许的关系表示(Specification Pattern

Environment Conditions:表示目前进行访问请求发生时的操作或情境的上下文

优点:可以更细粒度的进行访问控制

缺点:定义权限时,无法直观显示用户与对象之间的关系,如果规则有点复杂或设计混乱,管理员维护和跟踪会很麻烦

大体来说就是将主体、客体的属性、情境条件以及所要进行操作组合起来,对照着策略,判断是否符合策略规则。

Casbin实现ABAC(Python版)

假设情境

主体属性需要与客体所要求的属性相同,而且所进行的操作需要被客体允许的操作包含,需要满足一定情境条件。

定义对象
# model.py
class User:def __init__(self, role, name):self.role = roleself.name = nameclass Resource:def __init__(self, name, role, action):self.name = nameself.Role = roleself.action = actionclass Env:def __init__(self, time, location):self.Time = timeself.Location = locationdef is_schooltime(self):return 8 <= self.Time.hour <= 18
定义静态模型模板
# model.conf
[request_definition]
r = sub, obj, act, env[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers] # 定义了如何匹配Policy和Request,这里指的是主体角色等级需要大于客体角色等级,已经一些其他条件
m = r.sub.Role >= r.obj.Role && r.act in r.obj.action && 8 <= r.env.Time.hour <= 18
测试代码
# test.py
from model import User, Resource, Env
from casbin import Enforcer, model
from datetime import datetimedef test() :# 创建两个用户和资源user1 = User('a', 'ck')user2 = User('b', 'zn')src1 = Resource('简历','a', ['read', 'write'])src2 = Resource('测试文件','b', ['none', 'read'])users = [user1, user2]resources = [src1, src2]# 创建一个空的模型m = model.Model()# 从本地文件中导入模型m.load_model("/home/test-casbin/test/model.conf")# 创建 Enforcer 对象时直接传入 Model 对象enforcer = Enforcer(model=m)envs = [init_env(9), init_env(23)]for env in envs :print("\n时间:", env.Time)for user in users : for resource in resources :read_allow = enforcer.enforce(user.__dict__, resource.__dict__, 'read', env.__dict__) # 传递字典write_allow = enforcer.enforce(user.__dict__, resource.__dict__, 'write', env.__dict__)print(f"{user.Role} {user.Name} 读取 {resource.name}: {read_allow}")print(f"{user.Role} {user.Name}{resource.name}: {write_allow}")def init_env(hour):return Env(time=datetime(2019, 8, 20, hour, 0, 0), location="SomeLocation")if __name__ == "__main__":test()
最终结果
时间: 2019-08-20 09:00:00
a ck 读取 简历: True
a ck 写 简历: True
a ck 读取 测试文件: False
a ck 写 测试文件: False
b zn 读取 简历: True
b zn 写 简历: True
b zn 读取 测试文件: True
b zn 写 测试文件: False时间: 2019-08-20 23:00:00
a ck 读取 简历: False
a ck 写 简历: False
a ck 读取 测试文件: False
a ck 写 测试文件: False
b zn 读取 简历: False
b zn 写 简历: False
b zn 读取 测试文件: False
b zn 写 测试文件: False

相关链接

https://www.cnblogs.com/studyzy/p/11380736.html

《PML: An Interpreter-Based Access Control Policy Language for Web Services》: https://arxiv.org/pdf/1903.0975

https://github.com/casbin/pycasbin?tab=readme-ov-file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git使用命令大全

命令大全参考阮一峰的博客&#xff0c;根据自己的使用习惯作了调整。 Git常用命令 其他常用的命令 配置Git # 显示当前的Git配置 $ git config --list# 编辑Git配置文件 $ git config -e [--global]# 设置提交代码时的用户信息 $ git config [--global] user.name "[nam…

第14章_视图

第14章_视图 1.常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c; 程序员通常不…

MDK Keil uVision5 cannot read project file 解决办法

MDK Keil uVision5 cannot read project file 解决办法 问题描述 我的系统重装过后是英文版的Windows 10&#xff0c;在打开别人/以前中文系统环境下保存的Keil Project文件&#xff08;uvprojx文件&#xff09;会报错&#xff0c;内容大致是 Cannot read project file D:\xx…

JAVA生成Word文档

第一步&#xff1a;导入依赖 <!--生成word文档--> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.3</version> </dependency> <!--数字转为汉字大写--> <depend…

《代码之丑》学习笔记18——写代码是一件可以一生精进的事

结束语 | 写代码是一件可以一生精进的事 文章目录 结束语 | 写代码是一件可以一生精进的事代码的敏感度 在很多人心目中&#xff0c;程序员是一个辛苦的职业&#xff0c;一方面&#xff0c;各种新东西层出不穷&#xff0c;程序员们要努力追随&#xff0c;另一方面&#xff0c;业…

十、VTK创建圆锥体vtkConeSource 带颜色

为圆锥体的每一面,添加一种颜色: 上述效果的代码: #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkLine.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h> #include <vtkPolyDataMapper.h> #incl…

机器学习复习(6)——numpy的数学操作

加减法运算 # 创建两个不同的数组 a np.arange(4) #list(0,1,2,3 b np.array([5,10,15,20]) # 两个数组做减法运算 b-a 运行结果&#xff1a; 计算数组的平方 #b*2代表数组b每个元素乘以2 #b**2代表数组b每个元素的2次方 b**2 运行结果&#xff1a; 计算数组的正弦值 #…

Java 数据结构 二叉树(二)红黑树

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…

UnityShader(十五)纹理的属性

目录 面板属性&#xff1a; 多级渐远纹理技术&#xff08;mipmapping&#xff09; Filter Mode&#xff08;滤波模式&#xff09; 面板属性&#xff1a; 在Unity中导入一些纹理资源后可以在它的材质面板上调整其属性 如图&#xff1a; 在这个面板上有许多可以调整的属性&am…

Python的作用域

Python中的作用域是用来确定变量和函数的作用范围和生命周期的规则。在Python中&#xff0c;有四种类型的作用域&#xff1a;局部作用域、外层作用域、全局作用域和内置作用域。 一&#xff1a;局部作用域 在函数内部定义的所有变量都属于局部作用域。这些变量只能在该函数内…

西瓜书学习笔记——核化线性降维(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 核化线性降维是一种使用核方法&#xff08;Kernel Methods&#xff09;来进行降维的技术。在传统的线性降维方法中&#xff0c;例如主成分分析&#xff08;PCA&#xff09;和线性判别分析&#xff08;LDA&#xff09;&#xff0c;数据被映…

C++学习Day03之构造函数的调用规则

目录 一、程序及输出1.1 编译器会给一个类 至少添加3个函数1.2 自己提供了 有参构造函数1.3 自己提供了 拷贝构造函数 二、分析与总结 一、程序及输出 1.1 编译器会给一个类 至少添加3个函数 编译器会给一个类 至少添加3个函数 默认构造&#xff08;空实现&#xff09; 析构函…

QCoro: Qt C++ 20 协程库介绍

C20 推出了协程的实现&#xff08;coroutines&#xff09;。虽然开发一个支持协程特性的类库还是要花很多功夫的&#xff0c;但是使用一个开发好的类库则是非常嗨。这也是C 委员会一贯的原则&#xff1a; 如果你是类库开发者&#xff0c;必须足够有耐心学习拗口的特性。但如果…

MySQL分区的优缺点

前言 数据库中的分区技术为处理大规模数据提供了一种有效的手段&#xff0c;通过将数据划分成更小的可管理单元&#xff0c;我们能够提高查询性能、简化数据维护并更灵活地管理存储空间。然而&#xff0c;在采用分区时&#xff0c;我们必须认真考虑分区键的选择和实施细节&…

vue封装滚动表格

1.组件的使用 <div style"height:93%; overflow: hidden;"> <autoScroll :data"shortageList" :speed"0.5" :waitTime"500" :singleHeight"100" v-if"shortageList.length>0"><el-row v-for…

ACM训练题:曲线

这题只需要注意一个点&#xff0c;就是所有二次函数的二次系数都是大于0的&#xff0c;这说明这是个下凸函数&#xff0c;而且最小值旁边都是单调的&#xff0c;对于求区间凸函数极值问题&#xff0c;套三分模板即可。 AC代码&#xff1a; #include<bits/stdc.h> usin…

2023年全球软件开发大会(QCon上海站2023):核心内容与学习收获(附大会核心PPT下载)

在信息化和全球化日益加速的今天&#xff0c;软件开发技术日新月异&#xff0c;对全球各行各业产生了深远影响。2023年全球软件开发大会&#xff08;QCon上海站2023&#xff09;无疑成为行业内外瞩目的焦点。本次大会汇集了全球顶级的软件开发专家、企业领袖、研究者&#xff0…

nextcloud 优化扩展

cd /config vi config.php #ONLYOFFICE allow_local_remote_servers > true, #应用商店加速 appstoreenabled > true, appstoreurl > https://www.orcy.net/ncapps/v2/, #nginx配置调优 add_header Strict-Transport-Security max-age15552000; add…

cesium-加载谷歌影像

cesium在开发的时候有可能会加载不同的影像&#xff0c;今天就先看一下加载谷歌的吧。 使用谷歌有个好处就是基本不会出现此区域无卫星图的情况 闲言话语不多说&#xff0c;看代码 <template><div id"cesiumContainer" style"height: 100vh;"&g…

在nodejs中使用mysql2

目录 安装 mysql2:导入 mysql2 模块:创建数据库连接:执行查询操作:关闭数据库连接: 在之前的项目中nodejs模板使用的mysql包&#xff0c;mysql数据库版本是5.7&#xff0c;最近更新了数据库版本为mysql8&#xff0c;发现之前的代码无法成功连接数据库&#xff0c;经过排查发现问…