Rule-Engine-Starter V1.0.0

news2024/9/25 1:24:41

一个轻量级的规则引擎、搜索引擎,让条件匹配简单、优雅。


GIT地址

https://gitcode.cosmoplat.com/15011240224/rule-engine-starter

介绍

Rule-Engine-Starter 是一个轻量级规则引擎,V1.0.0主要解决条件匹配问题。比如飞书文档,每个文档都可以设置访问权限,可以限制哪些人、哪些部门可以访问、是否对互联网用户公开等等,这些条件可以看成每个文档设置的访问规则,一个文档可以设置多个规则。

校验一个用户是否能访问目标文档,只需要校验规则中的条件,可以使用SPEL等表达式来实现;但是如果想获取一个用户有访问权限的所有文档,如果再用SPEL实现岂不是需要遍历所有文档的所有规则,这种方案无疑是低效的。因此自研 Rule-Engine-Starter 解决这个问题,只需要将用户的属性作为条件输入给规则引擎,规则引擎会快速返回所有匹配的规则:

Rule-Engine-Starter 通过拉平条件和MySQL的B+Tree索引实现快速匹配。

Demo

访问地址:https://gitcode.cosmoplat.com/15011240224/rule-engine-demo

修改数据库配置后,可本地执行com.cosmoplat.rule.RuleTest。

使用

  1. MySQL初始化,执行src/main/sql/init.sql

  2. POM引入依赖和卡奥斯仓库

<dependency>
   <groupId>com.cosmoplat.rule</groupId>
   <artifactId>rule-engine-starter</artifactId>
   <version>1.0.0</version>
</dependency>

<repository>
    <id>maven-public</id>
    <name>maven-public</name>
    <url>http://nexus.cosmoplat.com/repository/maven-public/</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>
  1. 修改配置文件

    spring:
        datasource:
            url: jdbc:mysql://xxx.xxx.xxx.xxx:xxxxx/库名
            username: 用户名
            password: 密码
            driver-class-name: com.mysql.cj.jdbc.Driver
    
    # 启用规则引擎      
    rule:
        engine:
            enabled: true
    
  2. 创建维度

    Dimension dimension = Dimension.builder().namespaceId(NAMESPACE_ID)
            .code(dimensionEnum.getCode())
            .description(dimensionEnum.getName()).build();
    ruleEngineService.createDimensions(Collections.singletonList(dimension));
    
  3. 创建分类

    List<String> dimension = Lists.newArrayList(DimensionEnum.WORK_NO.getCode(), 
             DimensionEnum.DEPT_NO.getCode());
    Type ruleType = Type.builder().code(DOC_READ_RULE_TYPE_CODE).description("文档阅读规则")
            .namespaceId(NAMESPACE_ID).dimensionCodes(dimension).build();
    ruleEngineService.createTypes(Lists.newArrayList(ruleType));
    
  4. 添加规则

String docId1= "11111";
String docId2= "22222";
String docId3= "33333";
// 允许体验云和海云智造的员工阅读文档1
createDocReadRule(docId1, Lists.newArrayList(ALL), Lists.newArrayList("tiYanYun", "haiyunzhizao"));
// 只允许工号22038425阅读文档2
createDocReadRule(docId2, Lists.newArrayList("22038425"), Lists.newArrayList(ALL));
// 只允许工号77889998阅读文档3
createDocReadRule(docId3, Lists.newArrayList("77889998"), Lists.newArrayList(ALL));


private void createDocReadRule(String docId, List<String> workNos, List<String> deptNos) throws RuleConflictException {
    Package rule = new Package();
    rule.setNamespaceId(NAMESPACE_ID);
    rule.setTypeCode(DOC_READ_RULE_TYPE_CODE);
    rule.setName("文档阅读规则");
    rule.setCreateInfo();
    // 匹配结果
    rule.setConfigInfo(docId);
    // 规则条件
    Map<String, List<String>> searchKeyMap = Maps.newHashMap();
    searchKeyMap.put(DimensionEnum.WORK_NO.getCode(), workNos);
    searchKeyMap.put(DimensionEnum.DEPT_NO.getCode(), deptNos);
    ruleEngineService.createRule(rule, searchKeyMap);
}
  1. 规则匹配

    // 规则匹配,返回体验云员工22038425能访问的文档
    Map<String, List<String>> searchAndSortKeyMap = Maps.newHashMap();
    searchAndSortKeyMap.put(DimensionEnum.WORK_NO.getCode(), Lists.newArrayList( "22038425", ALL));
    searchAndSortKeyMap.put(DimensionEnum.DEPT_NO.getCode(), Lists.newArrayList("tiYanYun", ALL));
    List<MatchRuleResult<String>> ret = ruleEngineService.matchRule(NAMESPACE_ID,
         DOC_READ_RULE_TYPE_CODE, searchAndSortKeyMap, null);
    
    List<String> docIds = ret.stream().map(MatchRuleResult::getResult).collect(toList());
    Assert.isTrue(docIds.contains(docId1), "文档1不能阅读");
    Assert.isTrue(docIds.contains(docId2), "文档2不能阅读");
    Assert.isTrue(!docIds.contains(docId3), "文档3能阅读");
    

支持

如果您觉得有用,麻烦您按照链接支持下:链接

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

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

相关文章

API接口安全运营研究(内附官方开发平台api接口接入方式)

摘 要 根据当前API技术发展的趋势&#xff0c;从实际应用中发生的安全事件出发&#xff0c;分析并讨论相关API安全运营问题。从风险角度阐述了API接口安全存在的问题&#xff0c;探讨了API检测技术在安全运营中起到的作用&#xff0c;同时针对API安全运营实践&#xff0c;提出…

C++语言实现网络爬虫详细代码

当然&#xff01;下面是一个用C语言实现的基本网络爬虫的详细代码示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> size_t writeCallback(void* contents, size_t size, size_t nmemb, std::string* output) {size_t totalS…

ElementUI增删改的实现及表单验证

文章目录 一、准备二、添加功能2.1 新增添加按钮2.2 添加弹出框2.3 data中添加内容2.4 methods中添加相关方法 三、编辑功能3.1 表格中添加编辑和删除按钮3.2 methods中添加方法3.3 修改methods中clear方法3.4 修改methods中的handleSubmit方法 四、删除书籍功能4.1 往methods的…

“开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界”

“开启中文智能之旅&#xff1a;探秘超乎想象的 Llama2-Chinese 大模型世界” 1.国内Llama2最新下载地址 本仓库中的代码示例主要是基于Hugging Face版本参数进行调用&#xff0c;我们提供了脚本将Meta官网发布的模型参数转换为Hugging Face支持的格式&#xff0c;可以直接通过…

Linux上通过mysqldump命令实现自动备份

Linux上通过mysqldump命令实现自动备份 直接上代码 #!/bin/bash mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4"backup_location/home/mysql/mysql_back/sql # 是否开始自动删除过期文件,过期时间…

PUPANVR-LVGL UI主菜单及设置窗体框架(9)

PUPA NVR UI主菜单及设置窗体框架 在设计UI时&#xff0c;竟量把数据、控制、显示&#xff0c;分开&#xff0c;即MVC的一个模式吧&#xff01;使用MVC这样的模式思想&#xff0c;会让代码简洁不少&#xff0c;逻辑也很清析&#xff01; 具体的代码见&#xff1a; PUPANVR这个…

北邮22级信通院数电:Verilog-FPGA(4)第三周实验:按键消抖、呼吸灯、流水灯 操作流程注意事项

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.注意事项 二.按键消抖 2.1 LED_deboun…

面试题补充

1.公司有几套环境&#xff1a;测试环境&#xff08;测试人员使用&#xff09;&#xff0c;开发环境&#xff08;开发人员使用&#xff09;&#xff0c;预生产环境&#xff08;测试人员使用&#xff09;&#xff0c;生产环境&#xff08;用户使用&#xff09; 2.作为一名测试&a…

关于GP7 release版在麒麟V10信创操作系统编译不过的问题解决

背景 大家期盼已久的Greenplum 7 最终版终于发布了&#xff01;好消息&#xff01;&#xff01; 很多同学已经忍不住想快速试用GP 7新版本了&#xff0c;同时&#xff0c;为了满足信创要求&#xff0c;需要在国产的操作系统服务器上运行GP。 然后官方的GP 7并没有明确声明支持…

run_main_loop 到 cmd_process处理说明三

一. run_main_loop 到 cmd_process处理过程 之前文章了解了 uboot的命令格式组成。本文简单分析下 cmd_process函数对 uboot命令的处理过程。 本文继上一篇文章的学习&#xff0c;地址如下&#xff1a; uboot启动流程-run_main_loop 到 cmd_process处理说明二-CSDN博客 二. …

扎克伯格:希望借助数字助理、智能眼镜和AI帮助推动元宇宙发展

Meta推出了新的人工智能工具和名人代言的数字助手&#xff0c;首席执行官马克扎克伯格希望这些工具可以帮助推动元宇宙的发展。 9月30日消息&#xff0c;据外媒报道&#xff0c;Meta推出了新的人工智能工具和名人代言的数字助手&#xff0c;首席执行官马克扎克伯格希望这些工具…

Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突

注释掉2.0引入的俩包 直接引入3.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency> swagger配置文件粘贴即用哦 import org.springfram…

提取Android盒子dtb文件

概述 最近从某鱼上掏了一个CM201-1 YS的盒子&#xff0c;动手倒腾倒腾&#xff0c;准备安装Armbian&#xff0c;用来做矿机&#xff0c;但该型号的盒子ophub上面没有完全适配的镜像&#xff0c;故而想尝试下&#xff0c;看能否整个适配镜像出来。 操作系统 Windows Linux 工…

JMeter—逻辑控制器

JMeter逻辑控制器 JMeter逻辑控制器可以对元件的执行逻辑进行控制&#xff0c;除仅一次控制器外&#xff0c;其他可以嵌套别的种类的逻辑控制器  一、ForEach控制器 定义一个循环规则&#xff0c;关键参数说明&#xff1a;   输入变量前缀&#xff1a;可以在“用户自定义的…

10月TIOBE榜Java跌出前三!要不我转回C#吧

前言 Java又要完了&#xff0c;又要没了&#xff0c;你没看错&#xff0c;10月编程语言榜单出炉&#xff0c;Java跌出前三&#xff0c;并且即将被C#超越&#xff0c;很多资深人士预测只需两个月&#xff0c;Java就会跌出前五。 看到这样的文章&#xff0c;作为一名Java工程师我…

Cmake 3.27.5 发布,开源构建系统

导读CMake 是一个跨平台的自动化构建系统&#xff0c;它使用一个名为 CMakeLists.txt 的文件来描述构建过程&#xff0c;可以产生标准的构建文件&#xff0c;如 Unix 的 Makefile 或 Windows Visual C 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写&#xff0c;也…

静电地桩的安装和使用说明

静电地桩的安装使用需要遵循以下步骤&#xff1a; 确定静电地桩的位置&#xff1a;静电地桩应该安装在需要消除静电的区域&#xff0c;如易燃易爆场所、电子厂、医院等。在安装前需要对地面进行清洁和处理&#xff0c;确保地面平整、干燥、无灰尘等杂物。 安装静电地桩&#xf…

FPM-FORM

FPM DEMO&#xff1a;FPM_OVP_COMPONENT FORM&#xff1a; IF_FPM_GUIBB_FORM TABLE LIST&#xff1a; IF_FPM_GUIBB_LIST TREE&#xff1a; IF_FPM_GUIBB_TREE SEARCH LIST&#xff1a; IF_FPM_GUIBB_SEARCH 需求&#xff1a;FPM启动时默认从EKPO去一条采购订单数据&#xff…

想要用Chat GPT写申请文书?先看各大名校招生官对它的态度是什么?

新的申请季已经正式开始&#xff0c;一些热门项目的ED截止日期也不再遥远&#xff0c;因此很多准留学生们都已经开始了关于文书的创作。 而随着科技的不断发展&#xff0c;以ChatGPT为首的一众AI工具也作为一种辅助手段愈发融入了我们的生活。 那么不免就会有一些同学在准备申…

提升后端API性能的几种解决方案

&#x1f514;目的 提升后端API性能的主要目的是为了提高系统整体的响应速度、并发能力以及可用性。主要原因包括: 提高用户体验 后端API性能好可以减少响应延迟,给用户流畅的体验。 提高系统吞吐量 优化API性能可以提高系统的整体吞吐量,处理更多用户请求。 节省服务器资源…