golang每日一库——casbin开源的访问控制框架

news2024/9/29 22:49:43

文章目录

  • casbin
  • casbin工作原理——PERM
      • 请求——Request
      • 策略——Policy
      • 匹配器——Matcher
      • 效果——Effect
  • Model语法
    • Request定义
    • Policy定义
    • Policy effect定义
    • Matchers定义
  • 编辑器
    • 例子1
    • 例子2
    • 例子3
    • 例子4
    • 例子5
    • 例子6
    • 例子7
    • 例子8
    • 例子9

casbin

Casbin是一个强大且高效的开源访问控制库,支持各种访问控制模型,用于在全局范围内执行授权。

casbin工作原理——PERM

在 Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个文件。 因此,切换或升级项目的授权机制与修改配置一样简单。 您可以通过组合可用的模型来定制您自己的访问控制模型。

例如,您可以在一个model中结合RBAC角色和ABAC属性,并共享一组policy规则。

PERM模式由四个基础(政策、效果、请求、匹配)组成,描述了资源与用户之间的关系。

请求——Request

定义请求参数。基本请求是一个元组对象,至少需要主题(访问实体)、对象(访问资源) 和动作(访问方式)

例如,一个请求可能长这样: r={sub,obj,act}

它实际上定义了我们应该提供访问控制匹配功能的参数名称和顺序。

策略——Policy

定义访问策略模式。事实上,它是在政策规则文件中定义字段的名称和顺序。

例如: p={sub, obj, act}p={sub, obj, act, eft}

注:如果未定义eft (policy result),则策略文件中的结果字段将不会被读取, 和匹配的策略结果将默认被允许。

匹配器——Matcher

匹配请求和政策的规则。

例如: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj 这个简单和常见的匹配规则意味着如果请求的参数(访问实体,访问资源和访问方式)匹配, 如果可以在策略中找到资源和方法,那么策略结果(p.eft)便会返回。 策略的结果将保存在 p.eft 中。

效果——Effect

它可以被理解为一种模型,在这种模型中,对匹配结果再次作出逻辑组合判断。

例如: e = some (where (p.eft == allow))

这句话意味着,如果匹配的策略结果有一些是允许的,那么最终结果为真。

让我们看看另一个示例: e = some (where (p.eft == allow)) && !some(where (p.eft == deny) 此示例组合的逻辑含义是:如果有符合允许结果的策略且没有符合拒绝结果的策略, 结果是为真。 换言之,当匹配策略均为允许(没有任何否认)是为真(更简单的是,既允许又同时否认,拒绝就具有优先地位)。

Casbin中最基本、最简单的model是ACL。ACL中的model 配置为:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACL模型的一个示例策略类似:

p, alice, data1, read
p, bob, data2, write

它意味着:

  • alice可以读取data1
  • bob可以编写data2

我们还支持多行模式,通过在结尾处追加“\”:

#  匹配器
[matchers]
m = r.sub == p.sub && r.obj == p.obj \ 
  && r.act == p.act

此外,对于 ABAC,您在可以在 Casbin golang 版本中尝试下面的in (jCasbin 和 Node-Casbin 尚不支持) 操作:

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

但是你应确保数组的长度大于 1,否则的话将会导致 panic 。

Model语法

  • Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]
  • 如果 model 使用 RBAC, 还需要添加[role_definition]部分。
  • Model CONF 文件可以包含注释。注释以 # 开头, # 会注释该行剩余部分。

Request定义

[request_definition] 部分用于request的定义,它明确了 e.Enforce(...) 函数中参数的含义。

[request_definition]
r = sub, obj, act

sub, obj, act 表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。
但是, 你可以自定义你自己的请求表单, 如果不需要指定特定资源,则可以这样定义 sub、act ,或者如果有两个访问实体, 则为 sub、sub2、obj、act

Policy定义

[policy_definition] 部分是对policy的定义,以下文的 model 配置为例:

[policy_definition]
p = sub, obj, act
p2 = sub, act

这些是我们对policy规则的具体描述

p, alice, data1, read
p2, bob, write-all-objects

policy部分的每一行称之为一个策略规则, 每条策略规则通常以形如p, p2policy type开头。 如果存在多个policy定义,那么我们会根据前文提到的policy type与具体的某条定义匹配。 上面的policy的绑定关系将会在matcher中使用, 罗列如下:

(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)

TIP
策略规则中的元素总被视为字符串

Policy effect定义

[policy_effect] 是策略效果的定义。 它确定如果多项政策规则与请求相符,是否应批准访问请求。 例如,一项规则允许,另一项规则则加以拒绝。

[policy_effect]
e = some(where (p.eft == allow))

上面的策略效果表示如果有任何匹配的策略规则 允许, 最终效果是 允许 (aka allow-override). p.eft 是策略的效果,它可以 允许否定。 它是可选的,默认值是 允许。 因为我们没有在上面指定它,所以它使用默认值。

策略效果的另一个例子是:

[policy_effect]
e = !some(where (p.eft == deny))

这意味着如果没有匹配的政策规则为否定, 最终效果是 允许 (别名为拒绝). some 表示:如果存在一个匹配的策略规则。 any 意味着:所有匹配的政策规则(这里不使用)。 策略效果甚至可以与逻辑表达式相关联:

[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

这意味着至少有一个匹配的策略规则允许,并且没有匹配的否定的 的策略规则。 因此,允许和拒绝授权都得到支持,拒绝则被推翻。

NOTE
尽管我们设计了政策效果的语法。 目前的执行只是使用硬编码的政策效果,因为我们认为这种灵活性没有多大必要。 所以现在您必须使用内置的政策效果之一,而不是自定义您自己的效果。

支持的内在政策效应是:

Policy effect意义示例
some(where (p.eft == allow))allow-overrideACL, RBAC, etc.
!some(where (p.eft == deny))deny-overrideDeny-override
some(where (p.eft == allow)) && !some(where (p.eft == deny))allow-and-denyAllow-and-deny
priority(p.eft) || denypriorityPriority
subjectPriority(p.eft)基于角色的优先级主题优先级

Matchers定义

[matchers] 是策略匹配程序的定义。匹配程序是表达式。它定义了如何根据请求评估策略规则。

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

上述匹配器是最简单的,这意味着请求中的主题、对象和行动应该与政策规则中的匹配。

您可以在匹配器中使用诸如 +, -, *, / 和逻辑操作员,例如 &&, ||, !

编辑器

例子1

模型ACL
在这里插入图片描述
当请求为alice, data1, read时,执行结果为true。当请求为alice, data1, write时,返回false。以上为最简单的ACL模型。

例子2

模型ACL

当为Policy添加effect时,如下
在这里插入图片描述
当策略为deny时,执行结果为false。修改策略为allow时,返回true。

例子3

模型ACL

在这里插入图片描述
当策略中存在deny和allow时,成功匹配,返回true。但是实际中,我们应以拒绝优先。此时,我们可以考虑修改Policy effect,运用内建的allow-and-deny条目。

some(where (p.eft == allow)) && !some(where (p.eft == deny))	

条目可以解释为,有一条通过,没有一条等于deny。
在这里插入图片描述

必须使用内建的策略规则,就是上面表格那5条

例子4

RBAC模型
在这里插入图片描述

匹配data1_admin角色,角色包含write权限,匹配通过

例子5

RBAC模型
在这里插入图片描述

策略直接匹配bob用户通过

例子6

RBAC模型
在这里插入图片描述
策略直接限制bob用户无法通过

例子7

RBAC模型
在这里插入图片描述
在例子6中添加一条策略g, bob, data2_admin得例子7。此时,匹配data2_admin域,但是bob用户本身无法通过

例子8

RBAC模型
在这里插入图片描述
修改名字为bob1,添加策略g, bob1, data2_admin,通过。p, bob, data2, write, deny策略无法限制用户bob1

例子9

模型RBAC with domains/tenants
在这里插入图片描述
请求匹配admin角色,但是domain2域内只有一条,仅可操作data2数据,与请求中的data1数据不符,故无法通过。

添加策略p, admin, domain2, data1, read或者p, alice, domain2, data1, read可以通过。

在这里插入图片描述

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

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

相关文章

软件测试基础:功能测试知识详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中…

postman使用指北

粘贴 cURL 请求 环境设置 作用:方便切换不同环境,比如配置本地环境/测试环境/线上环境,通过切换环境就可以请求对应环境的接口 配置环境 切换环境请求 Pre-request Script 可以在发送请求之前执行一些脚本操作 1. 常用指令 // 获取请求方…

C++中const的用法

const 我们都见过,但是今天,我们会从头开始重新再说const的所有用法。 一、const修饰普通变量 当我们定义一个变量时,前面加上const修饰的话,这个变量将不再能被修改,称之为常变量。例如: int a10; a20;…

ESD分类和等级划分

1、HBM:Human Body Model,人体模型 2、CDM:Charged Device Model,充电器件模型 3、MM:Machine Model,机器模型: 数据来源网站

总结Java文件操作

文件:文件是一个广义的概念 在操作系统中文件可以指硬件资源和软件资源为文件;也可以指存储在硬盘上的文件,文件夹也是文件;文件夹是通俗的叫法,专业的叫法是目录; 查看我们的硬盘,我们可以发…

C语言分析数据在内存中的存储一:(整形在内存中的存储)

数据类型介绍 我们知道C语言有很多内置类型: char //字符数据类型 1 个字节short //短整型 2 个字节int //整形 4 个字节long //长整形 4 个字节long long //更长的整形 8 个字节float //单精度浮点数 4 个字节dou…

Linux学习记录(十三)----信号

文章目录 6.信号1.信号的发送(发送信号进程)kill:raise:alarm : 2.信号的接收3.信号的处理信号父子进程间通信 7.信号灯(semaphore)创建信号灯函数控制信号灯函数PV操作 声明:本人撰写的为学习笔记内容来源于网络,如有侵权联系删除…

SQL Server中如何自动抓取阻塞

背景 当发数据库生阻塞时,可以通过SQL语句来获取当前阻塞的会话情况,可以得到下面的信息 说明:会话55阻塞了会话53。两个会话都执行了update test set fid10 where fid0。 但我们也经常碰到客户生产环境出现阻塞,由于不会抓取或者…

YOLOv8实现任意目录下命令行训练

问题 当你使用YOLOv8命令行训练模型的时候,如果当前执行的目录下没有相关的预训练模型文件,YOLOv8就会自动下载模型权重文件。这个是一个正常操作,但是你还会发现,当你在参数model中指定已有的,在其他目录下的预训练模…

实际案例:某日化集团主数据建设项目

一、建设背景1. 背景分析当前,该日化企业集团的主数据尚处于分散状态,分布于各业务系统中,缺乏一套专业的主数据管理系统进行统一管理。因此,数据无法在全集团范围内共享使用,且在业务端到端的流程拉通时,数…

WPS关闭后,进程依然在后台运行的解决办法

问题 wps启动后 在启动wps后,什么都不做,打开进程管理器,发现居然运行了3个wps进程: win10只会显示wps进程: win11显示比较准确: 关闭后 在关闭wps,再去任务管理器查看,发现在…

游戏开发设计模式之策略模式

目录 策略模式在游戏开发中的具体应用案例有哪些? 如何在Unity中实现策略模式以优化角色行为和AI策略? 策略模式与其他设计模式(如观察者模式、状态模式)在游戏开发中的比较优势是什么? 策略模式的优势 观察者模式…

基于SpringBoot的闲一品交易平台

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架 Java技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员…

【手撕OJ题】——160. 相交链表

目录 🕒 题目⌛ 方法① - 遍历记录链表长度⌛ 方法② - 双指针 🕒 题目 🔎 160. 相交链表【难度:简单🟢】 🔎 面试题 02.07. 链表相交 🔎 剑指 Offer 52. 两个链表的第一个公共节点 给你两个单…

hadoop集成spark(spark on yarn)

文章目录 hadoop集成spark(spark on yarn)下载spark软件包spark文件设置spark-env.shworkers 环境变量设置发送spark到其余机器启动spark hadoop集成spark(spark on yarn) 在hadoop搭建完成的前提下,集成spark&#x…

【面试题系列Vue02】Vue Router 路由都有哪些模式?各模式之间有什么区别?

官方解析 Vue Router 路由有三种模式: hash 模式:使⽤ URL 中的 hash(即 # 后面的内容)来作为路由路径。 在这种模式下,页面不会重新加载,只会更新 hash 值,并触发路由变化,从而渲…

c语言杂谈系列:模拟虚函数

从整体来看&#xff0c;笔者的做法与之前的模拟多态十分相似&#xff0c;毕竟c多态的实现与虚函数密切相关 废话少说&#xff0c;see my code&#xff1a; kernel.c#include "kernel.h" #include <stdio.h>void shape_draw(struct shape_t* obj) {/* Call dr…

气膜粮仓:卓越的抗风雪能力与高性能材料—轻空间

在粮食储存领域&#xff0c;气膜粮仓以其卓越的抗风雪能力和高性能材料成为了现代农业的首选。其独特的设计和先进的材料使其在各种极端天气条件下依然能够保证粮食的安全和品质。 强抗风雪能力&#xff0c;保障粮仓安全 气膜粮仓采用了创新的结构设计&#xff0c;能够有效抵御…

Selenium + Python 自动化测试19(补充-读取各种文件数据操作)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了数据驱动测试中如何完成重复的测试实例&#xff0c;今天我们补充一些读取各种文件的方法。 本篇文章我们讨论一下如何使用读取txt、CSV、Excel文件&#xff0…

burpsuite xssValidator插件(xss插件)

安装 1. 商城安装插件 2. 安装环境 Download PhantomJShttps://phantomjs.org/download.htmlGitHub - NetSPI/xssValidator: This is a burp intruder extender that is designed for automation and validation of XSS