当前位置: 首页 > news >正文

Casbin实战经验大揭秘:教育培训领域的创新实践和高效优化策略

策略描述语言(论文)

摘要: 为了保护云资源的安全,防止数据泄露和非授权访问,必须对云平台的资源访问实施访问控制。然而,目前主流云平台通常采用自己的安全策略语言和访问控制机制,从而造成两个问题:

  1. 云用户若要使用多个云平台,则需要学习不同的策略语言,分别编写安全策略;
  2. 云服务提供商需要自行设计符合自己平台的安全策略语言及访问控制机制,开发成本较高。

对此,提出一种基于元模型的访问控制策略描述语言PML及其实施机制PML-EM.PML支持表达BLP、RBAC、ABAC等访问控制模型。

PML-EM实现了3个性质:策略语言无关性访问控制模型无关性程序设计语言无关性,从而降低了用户编写策略的成本与云服务提供商开发访问控制机制的成本。

在线论文地址:http://www.jos.org.cn/jos/article/abstract/5624

Casbin框架介绍

Casbin 是一个强大的、高效的开源访问控制框架,支持 Go, Java, Node.js, Javascript (React), Python, PHP, .NET, C++, Rust 等十几种语言。

Casbin 开源项目由北京大学罗杨博士创立于 2017 年,核心维护团队有二十多人。Casbin 在业界具有广泛影响力。

目前已经被 Intel 、VMware 、Orange 、RedHat 、T-Mobile 等公司开源使用,被腾讯云、Cisco 、Verizon 等公司闭源使用。具体详见 Casbin 主页。Casbin Go 主项目目前 GitHub 10000+ stars,加上所有语言的实现、插件等可达到 15000+ stars

官方地址:https://casbin.org/

核心技术

基于创始人在北大提出的PERM元模型的学术论文(英文版:arXiv,中文版: 软件学报)

PERM:Policy, Effect, Request, Matcher

Model语法和策略存储

Model语法

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

Model存储

与 policy 不同,model 只能加载,不能保存。因为我们认为 model 不是动态组件,不应该在运行时进行修改,所以我们没有实现一个 API 来将 model 保存到存储中。

Policy存储

在Casbin中,适配器(adapter,Casbin的中间件)实现了policy规则写入持久层的细节。Casbin的用户可以调用adapter的LoadPolicy()方法从持久层中加载policy规则,同样也可以调用SavePolicy()方法将Policy规则保存到持久层中。

支持的 Model

  1. ACL (Access Control List)访问控制列表
  2. 具有 超级用户 的 ACL
  3. 没有用户的 ACL: 对于没有身份验证或用户登录的系统尤其有用。
  4. 没有资源的 ACL: 某些场景可能只针对资源的类型, 而不是单个资源, 诸如 write-article, read-log等权限。 它不控制对特定文章或日志的访问。
  5. RBAC (基于角色的访问控制)
  6. 支持资源角色的RBAC: 用户和资源可以同时具有角色 (或组)。
  7. 支持域/租户的RBAC: 用户可以为不同的域/租户设置不同的角色集。
  8. ABAC (基于属性的访问控制): 支持利用resource.Owner这种语法糖获取元素的属性。
  9. RESTful: 支持路径, 如 /res/*, /res/:idHTTP 方法,如 GET, POST, PUT, DELETE
  10. 拒绝优先: 支持允许和拒绝授权, 拒绝优先于允许。
  11. 优先级: 策略规则按照先后次序确定优先级,类似于防火墙规则。

模型Model元语定义说明

最简单的ACL模型配置

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

在线编辑器:https://casbin.org/en/editor

Casbin插件生态

支持多种访问控制模型

适用场景

多租户(tenant)

协同工作

项目实战

项目架构

数据表设计

认证&授权

更多了解:https://cloud.tencent.com/developer/article/1695510

多租户&中间件

多租户数据表设计

注:同一个RDS实例的不同数据库

中间件权限验证

注:需要权限访问模块接口中间件。这里使用不同的Sass站点有不同的数据库。

权限验证类Permission.php

/*** @desc 权限验证* @author Tinywan(ShaoBo Wan)* @date 2020/3/29 10:37*/declare(strict_types=1);namespace app\common\library;use app\common\service\JwtService;
use Casbin\Exceptions\CasbinException;
use tauthz\facade\Enforcer;
use think\facade\Log;
use think\Request;class Permission
{// 不验证权限节点protected array $public_rule = ['/f/v1/books','/f/v1/homes',];/*** @desc: 权限验证检测* @return bool* @author Tinywan(ShaoBo Wan)*/public function check(): bool{$url = $this->request->baseUrl();if (in_array($url, $this->public_rule)) {return true;}try {$uid = JwtService::getCurrentUID();$action = $this->request->method();if (!Enforcer::enforce(strval($uid), $url, strtoupper($action))) {return false;}} catch (CasbinException $exception) {Log::error('Cabin 授权异常' . $exception->getMessage());return false;}return true;}
}

中间件调用类AuthorizationMiddleware.php

class AuthorizationMiddleware
{/*** @param $request* @param Closure $next* @return mixed* @throws AuthorizationException* @throws Exception*/public function handle($request, Closure $next): Response{if (!(new Permission($request))->check()) {throw new AuthorizationException();}return $next($request);}
}

接口访问权限流程

+-----------------------| RESOURCE EXISTS ? (if private it is often checked AFTER auth check)+-----------------------|       |NO |       v YESv      +-----------------------404     | IS LOGGED-IN ? (authenticated, aka has session or JWT cookie)or      +-----------------------401        |              |403     NO |              | YES3xx        v              v401            +-----------------------(404 no reveal)       | CAN ACCESS RESOURCE ? (permission, authorized, ...)or             +-----------------------redirect          |            |to login       NO |            | YES|            |v            v403          OK 200, redirect, ...(or 404: no reveal)(or 404: resource does not exist if private)(or 3xx: redirection)

基于角色的RBAC模型(Model)配置

keyMatch2函数:URL 路径或 : 模式下,例如: /v1/notices/:id

regexMatch函数:任意字符串,正则表达式模式,列如:GET、get、Get、(GET|POST|DELETE)

实际代码模型配置rbac-model.conf

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[role_definition]
g = _, _[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == 10086

策略表记录

区县策略:以上针对区县 area 角色,定义了5条策略,分别是通知公告接口的列表、创建、修改、删除、详情。

账号权限:账号 103233、103234、10370488 继承了区县策略组 area,则账号 103233、103234、10370488 将会拥有通知公告接口的列表、创建、修改、删除、详情的访问权限。

小问题:仅只需要给账号 10370488 开通一条特殊的接口权限(如:健康码查询接口),该权限不能添加到策略组 area。那么可行的解决方案有哪些?:

  • 第一版方案(低级):入侵,修改代码,在代码层给账号 10370488增加判断放行
  • 第二版方案(中级):非入侵,修改代码,通过AOP解决
  • 第三版方案(高级):非入侵,不修改代码,策略规则表只需要添加一条以下一条策略

传统框架 VS 现代化框架

原理

在常驻内存框架中使用Casbin。Swoole、Workerman、ReactPHP 运行模式为多进程,而多进程中数据是互相隔离的(每个进程都是独立互不干扰的,这意味着每个进程都维护着自己的资源、变量和类实例等)。注意:内存溢出,垃圾回收机制(GC)。

场景

当Enforcer中的策略发生变化时,调用 Watcher,向消息队列(MQ)中推动消息,监听该消息队列的Enforcer收到后,自动刷新该实例中的策略。

注意:在 PHP-FPM 环境下,并不需要Watcher,因为每个请求都是一个独立的fpm进程,都会实例化一个全新的Enforcer实例。

实现

这里通过基于workerman的PHP异步redis客户端 workerman/redis 的发布订阅模式实现(观察者模式)。

Enforcer & Watcher

实例化Enforcer 同时监控订阅策略的变化,实时刷新到内存中。

更多源码查看地址:https://github.com/php-casbin/webman-permission

相关文章:

Casbin实战经验大揭秘:教育培训领域的创新实践和高效优化策略

策略描述语言(论文) 摘要: 为了保护云资源的安全,防止数据泄露和非授权访问,必须对云平台的资源访问实施访问控制。然而,目前主流云平台通常采用自己的安全策略语言和访问控制机制,从而造成两个问题&#x…...

MyBatis篇---第一篇

系列文章目录 文章目录 系列文章目录一、什么是MyBatis二、说说MyBatis的优点和缺点三、#{}和${}的区别是什么?一、什么是MyBatis (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、…...

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

目录 项目场景:三类分类部分不显示问题描述:数据库序号128后的目录不显示原因分析: 数据库&JAVA后端代码:后端接口 解决方案:1 数据库序号问题2 JAVA层面1 递归改成非递归写法2重新写接口: 查询cat_id为…...

Leetcode1839. 所有元音按顺序排布的最长子字符串

Every day a Leetcode 题目来源:1839. 所有元音按顺序排布的最长子字符串 解法1:滑动窗口 要找的是最长美丽子字符串的长度,我们可以用滑动窗口解决。 设窗口内的子字符串为 window,每当 word[right] > window.back() 时&…...

C/C++程序设计和预处理

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…...

openssl生成自签名证书

原网址:https://blog.csdn.net/weixin_41767181/article/details/121531007 windows下安装openssl后,生成自签名证书并打包为P12文件的命令如下: 需要注意的是: 每一级的证书中,证书的公司名称等尽量不要一样根证书…...

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)

基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表: 1、 数据管理:物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…...

深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识

文章目录 🌟 技术架构:深度学习推荐系统的经典技术架构长啥样?🍊 一、深度学习推荐系统的技术架构🍊 二、基于用户行为的推荐🍊 三、基于多模态数据的推荐🍊 四、基于知识图谱的推荐 &#x1f3…...

ios UI 基础开发二

第一节:UIPickerView、UIPickerViewDataSource、UIPickerViewDelegate 设置约束,如果要设置两个兄弟的约束,可以按住option键,用鼠标右键把a拖到b上面,表示a按照b来对齐 生成随机数 如果后面列的数据,依赖前…...

失配树学习笔记

失配树,是一种奇妙的数据结构,它利用 KMP、LCA 解决求两前缀的最长公共 Border 的问题。 首先介绍一下什么是 Border,我们知道 nxt 数组是前后缀相同的最大长度,Border 相当于是 nxt 数组的弱化版,只是去掉了“最大”…...

【Electron】Not allowed to load local resource

问题描述 使用 audio 标签播放音频文件,控制台报错 Not allowed to load local resource。 Not allowed to load local resource原因分析 通常是安全策略所引起的。Electron 默认情况下禁止加载本地资源,以防止潜在的安全风险。 解决方案 在 main.js…...

Maven 基础教程系列

Maven是一个项目开发管理和理解工具。基于项目对象模型的概念:构建、依赖关系管理、文档创建、站点发布和分发发布都由pom.xml声明性文件控制。Maven可以通过插件进行扩展,以使用许多其他开发工具来报告或构建过程。 一、Maven 使用教程-CSDN博客 二、…...

c++之类和对象

1.auto 可以自动推导结果的类型 typeid()可以打印类型 引用也可以 auto真正的价值可以简化迭代器的写法 并且auto定义的变量必须初始化。 不能做参数 返回值也不可以用auto auto不能用来声明数组 如果想要修改要用引用且指针不好解决。 c11之后的nullptr 以后再用空指针用nul…...

分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计

本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 本文的内容主要围绕以下几个部分: TCP/IP的简单介绍。消息的介绍。基于消息分类的传输格式&…...

医疗领域的数字化浪潮:互联网医院平台的关键作用

数字化浪潮正在迅速改变医疗领域的方式和效率。互联网医院平台作为数字化医疗的关键元素,正在为医疗行业带来巨大的变革。本文将探讨互联网医院平台的关键作用,并提供一个示例,使用Python编写一个简单的医疗预约系统。 互联网医院平台的关键…...

将本地的项目上传到Gitee

目录 1.先在Gitee新建一个仓库,提交即可 2.进入到要上传的项目里面,右键选择 Git Bash Here 3.右键后就打开了Git命令窗口 4.配置你的用户名和邮箱(已经配置过则可跳过) 5.查看你的用户名和邮箱配置(可不查看) 6.输入git init指令&#…...

概率论_概率公式中的分号(;)、逗号(,)、竖线(|)

1. 概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类东西,以概率P(x;θ)为例,分号前面是x样本,分号后边是模型参数。 , 逗号代表两者地位平等,代表与的关系 | 竖线代表 if,一上面为例,就是如果…...

Spark Streaming 整合 Kafka

本文代码链接:https://download.csdn.net/download/shangjg03/88442308 1.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:`spark-streaming-kafka-0-8` 和 `spark-streaming-kafka-0-10`,其主要区别如下: 本文使用的 Kafka 版本为 `kafka_2.12-2.2.0`,故采用…...

【API篇】五、Flink分流合流API

文章目录 1、filter算子实现分流2、分流:使用侧输出流3、合流:union4、合流:connect5、connect案例 分流,很形象的一个词,就像一条大河,遇到岸边有分叉的,而形成了主流和测流。对于数据流也一样…...

flutter开发的一个小小小问题,内网依赖下不来

问题 由于众所周知的原因,flutter编译时,经常出现Could not get resource https://storage.googleapis.com/download.flutter.io…的问题,如下: * What went wrong: Could not determine the dependencies of task :app:lintVit…...

关于疲劳分析的各种方法

疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数,可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础,采用雨流法取出一个个相互独立、互不相关的应力循环&…...

第6章:Neo4j数据导入与导出

在实际应用中,数据的导入与导出是使用Neo4j的重要环节。无论是初始数据加载、系统迁移还是数据备份,都需要高效可靠的数据传输机制。本章将详细介绍Neo4j中的各种数据导入与导出方法,帮助读者掌握不同场景下的最佳实践。 6.1 数据导入策略 …...

Windows开机自动启动中间件

WinSW(Windows Service Wrapper 是一个开源的 Windows 服务包装器,它可以帮助你将应用程序打包成系统服务,并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…...

智能问数Text2SQL Vanna windows场景验证

架构 Vanna 是一个开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关功能。 机制 Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回 SQL 查询,这些查…...

C++.OpenGL (9/64)摄像机(Camera)

颜色(Color) 颜色理论在OpenGL中的应用 #mermaid-svg-dKNDfS4EKDUmG4Ts {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-icon{fill:#552222;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-text…...

循环神经网络(RNN):从理论到翻译

循环神经网络(RNN)是一种专为处理序列数据设计的神经网络,如时间序列、自然语言或语音。与传统的全连接神经网络不同,RNN具有"记忆"功能,通过循环传递信息,使其特别适合需要考虑上下文或顺序的任…...

【AI教我写网站-ECG datacenter】

阶段性总结:后端用户管理基础 在项目管理和协作中,清晰地阐述“为什么做”比“怎么做”更能凝聚共识和提供方向。我们不仅要理解技术实现,更要明白其背后的动机和意义。 让我们重新回顾并总结我们到目前为止的工作,这次会更侧重…...

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用,首先下载一个这东西: npm install babel-loader -D webpack配置: const path requir…...

系统模块与功能设计框架

系统模块与功能设计框架,严格遵循专业架构设计原则,基于行业标准(如微服务架构、DDD领域驱动设计)构建。设计采用分层解耦模式,确保可扩展性和可维护性,适用于电商、企业服务、数字平台等中大型系统。 系统…...

php apache构建 Web 服务器

虚拟机配置流程winsever2016配置Apache、Mysql、php_windows server 2016配置web服务器-CSDN博客 PHP 和 Apache 通过 ​​模块化协作​​ 共同构建 Web 服务器,以下是它们的交互机制和工作流程: ​​一、核心组件分工​​ 组件角色​​Apache​​Web …...