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

news2024/11/20 6:33:39

策略描述语言(论文)

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

  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 YES
    v      +-----------------------
   404     | IS LOGGED-IN ? (authenticated, aka has session or JWT cookie)
   or      +-----------------------
   401        |              |
   403     NO |              | YES
   3xx        v              v
              401            +-----------------------
       (404 no reveal)       | CAN ACCESS RESOURCE ? (permission, authorized, ...)
              or             +-----------------------
             redirect          |            |
             to login       NO |            | YES
                               |            |
                               v            v
                               403          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

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

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

相关文章

Jenkins简介及安装配置详解:开启持续集成之旅

目录 一、Jenkins介绍1.1 持续集成1.2 Jenkins持续集成的过程(传统方式与自动化部署) 二、环境搭建1、准备工作2、WEB发布服务器环境搭建3、SVN服务器环境搭建4、Jenkins环境搭建 一、Jenkins介绍 Jenkins是一个开源的、用Java编写的持续集成和持续交付&…

Defender Antivirus占用资源怎么禁止

前言 有时Defender Antivirus 突然磁盘IO很高。导致机器卡得很,开发代码很不方便,本文就介绍如何禁用这个服务。2f089809-2c6f-4fb7-86f5-8b5cbca8bd0d 操作 下载Defender Control https://www.sordum.org/9480/defender-control-v2-1/ 这是当前的最…

Adobe Photoshop 基本操作

PS快捷键 图层 选择图层 Ctrl T:可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层(盖印图层&#xff09…

uniapp实现登录组件之外区域置灰并引导登录

实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…

嵌入式学习笔记(61)位操作符

2.1.1.位与& (1)注意:位与符号是一个&,两个&&是逻辑与。 (2)真值表:1&00 1&11 0&00 0&10 (3)从真值表可以看出:位与操作的特点是,只有1和1位于结果为1,其余全是0. (4)…

【Java】Java 17 新特性

Java 17 新特性概览 1. Java 17 简介2. Java 17 新特性类型推断 - 新的 var 关键字垃圾回收器改进JEP 356 增强的伪随机数生成器(1)提供了一个新接口 RandomGenerator(2)提供了一个新类 RandomGeneratorFactory(3&…

Flutter的Don‘t use ‘BuildContext‘s across async gaps警告解决方法

文章目录 问题有问题的源码 问题原因问题分析Context的含义BuildContext的作用特殊情况 解决方法 问题 Flutter开发中遇到Don’t use BuildContext’s across async gaps警告 有问题的源码 if (await databaseHelper.isDataExist(task.title)) {showDialog(context: context,…

在PowerBI中提取IFC文件中的数据

推荐:用 NSDT编辑器 快速搭建可编程3D场景 在这篇文章中,我将逐步介绍从IFC文件中提取数据以创建 Shift IFC4PowerBI 函数的步骤。通过了解此工作流程,你能够更轻松地将 IFC 数据合并到自己的流程中。 在本文中,我们将重点关注文…

Reparameterization trick(重参数化技巧)

“Reparameterization trick”(重参数化技巧)是一种在训练生成模型中处理随机性潜在变量的方法,特别常见于变分自动编码器(VAE)等模型中。这个技巧的目的是使模型可微分(differentiable)&#x…

【源码】C++坦克大战源码

文章目录 题目介绍你收到的所有文件源码效果展示报告内容 题目介绍 代码量:1450 语言:C 你收到的所有文件 其中一个是devc版本,也可以用visual stdio 运行。 源码效果展示 typedef struct //这里的出现次序指的是一个AI_ta…

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景:最近项目的一个接口数据,需要去请求其他多个服务器的数据,然后统一返回; 问题点:如果遍历所有的服务器地址,然后串行请求就会出现请求时间过长,加入需要请求十个服务器&…

Xray联动crawlergo自动扫描漏洞教程

xray和crawlergo联动 xray下载: https://github.com/chaitin/xray/releases crawlergo下载:360-crawlergo: github:https://github.com/Qianlitp/crawlergo/releases 联动脚本: github:https://github.com/timwhitez/crawlergo_x_…

Qt扫盲-QColor 理论使用总结

QColor 理论使用总结 一、概述1. 构造函数2. 合法性校验3. 组成值检索 二、整数与浮点精度三、Alpha-Blended Alpha混合图四、预定义颜色五、扩展的RGB颜色模型六、HSV颜色模型七、HSL颜色模型八、CMYK颜色模型 一、概述 QColor 是Qt里面描绘颜色的一个属性类,这个…

【算法练习Day25】 重新安排行程N 皇后 解数独

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 重新安排行程N 皇后解数独总…

图论05-【无权无向】-图的广度优先BFS遍历-路径问题/检测环/二分图/最短路径问题

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 联通分量5. 环检测5.1 思路5.2 主要代码 6. 二分图检测6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 判断相邻两点的颜色是否一致 7. 最短路径问题7.1 思路7.2 代码 1. 代码…

使用 Visual Studio Code (VS Code) 作为 Visual C++ 6.0 (VC6) 的编辑器

使用 Visual Studio Code (VS Code) 作为 Visual C 6.0 (VC6) 的编辑器 由于一些众所周知的原因,我们不得不使用经典(过时)的比我们年龄还大的已有 25 年历史的 VC 6.0 来学习 C 语言。而对于现在来说,这个经典的 IDE 过于简陋&a…

python:红狐优化算法(Red fox optimization,RFO)求解23个基本函数

一、红狐优化算法 红狐优化算法(Red fox optimization,RFO)由Dawid Połap和 Marcin Woźniak于2021年提出,该算法模拟了红狐的狩猎行为,具有收敛速度快,寻优精度高等优势。 参考文献: Poap D …

华为OD技术面试-最短距离矩阵(动态规划、广度优先)

背景 记录2023-10-21 晚华为OD三面的手撕代码题,当时没做出来,给面试官说了我的想法,评价:解法复杂了,只是简单的动态规范 或 广度优先算法,事后找资料记录实现方式。 题目 腐烂的橘子 问题描述&#xff…

【项目实战】从零开始设计并实现一个接口异常链路分析器

这不是马上要到1024了吗,这不得弄个什么工具给部门项目提提效😯? 1. 背景 在我们服务端应用当中,我们往往会要求更高的性能和更高的稳定性,但实际开发的过程中,可能会出现很多赶时间的情况(也…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …