Rule-Engine-Starter V1.0.0

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


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.rhkb.cn/news/157132.html

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

相关文章

电脑系统升级Win11变卡顿?如何解决!

关于Win11系统更新的相关问题&#xff0c;Win11每一次更新之后会给大家带来更多功能&#xff01;但是每次更新也可能会出现掉驱动、无法打开应用、甚至是蓝屏或者进不去主页等问题&#xff01;所以为了帮助大家预防这些更新出现的后遗症&#xff0c;分享了一些小的方法&#xf…

[Error]在Swift项目Build Settings的Preprocessor Macros中定义的宏无效的问题

问题 如图&#xff0c;在Build Settings -> Preprocessor Macros中添加了ISADEMO1。但在代码中判断无效&#xff0c;还是会输出“isn’t ADemo” #if ISADEMOprint("is ADemo") #elseprint("isnt ADemo") #endif解决 如图&#xff0c;要让Preproces…

【已解决】MySQL:执行sql查询出错误数据(MySQL隐藏机制-类型转换导致)

目录 问题现象&#xff1a; 问题分析&#xff1a; 结论&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 问题现象&#xff1a; 今天在项目开发中发现了一个非常奇怪的bug&#xff1a; 如图&#xff0c;我在数据库中以“dept_id 1712651046956421123”为条件&#xff…

WEEX编译|加密市场三季度回顾及未来展望

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX 唯客交易所 本文要点&#xff1a; ● 在充满挑战的第三季度&#xff0c;比特币价格下跌 11.1%&#xff0c;因为众多资产类别都在努力应对利率上升的影响和对经济衰退的担忧。 ● 比特币…

CentOS 7 基于C 连接ZooKeeper 客户端

前提条件&#xff1a;CentOS 7 编译ZooKeeper 客户端&#xff0c;请参考&#xff1a;CentOS 7 编译ZooKeeper 客户端 1、Docker 安装ZooKeeper # docker 获取zookeeper 最新版本 docker pull zookeeper# docker 容器包含镜像查看 docker iamges# 准备zookeeper 镜像文件挂载对…

什么是指标体系,怎么搭建一套完整的指标体系?(附PDF素材)

什么是指标体系&#xff0c;怎么搭建一套完整的指标体系&#xff1f;数字化转型过程中&#xff0c;这个问题一直困扰着数据分析师。主要体现在&#xff1a; 各部门根据业务需求&#xff0c;都有一部分量化指标&#xff0c;但不够全面&#xff0c;对企业整体数据分析应用能力提…

3D机器视觉:解锁未来的立体视野

原创 | 文 BFT机器人 机器视觉领域一直在不断演进&#xff0c;从最初的二维图像处理&#xff0c;逐渐扩展到了更复杂的三维领域&#xff0c;形成了3D机器视觉。3D机器视觉技术的涌现为计算机系统带来了全新的感知和理解能力&#xff0c;这一领域的发展正日益受到广泛关注。本文…

掌动智能浅析Web自动化测试的重要性

在现代Web开发中&#xff0c;确保Web应用程序的质量和稳定性至关重要。Web自动化测试工具成为了开发团队的关键资源&#xff0c;帮助他们自动化测试流程、减少手动劳动&#xff0c;提高测试覆盖率和效率。本文将介绍Web自动化测试的重要性是什么! Web自动化测试的重要性&#x…

PanoFlow:学习360°用于周围时间理解的光流

1.摘要&#xff1a; 光流估计是自动驾驶和机器人系统中的一项基本任务&#xff0c;它能够在时间上解释交通场景。自动驾驶汽车显然受益于360提供的超宽视野&#xff08;FoV&#xff09;◦ 全景传感器。 然而&#xff0c;由于全景相机独特的成像过程&#xff0c;为针孔图像设计…

【二甲医院his系统源码】医疗卫生信息化大数据平台源码

基于云计算技术的SaaS服务的医院信息系统源码 云HIS系统有效实现医疗数据共享与交换&#xff0c;解决数据重复采集及信息孤岛等问题。重构管理服务流程&#xff0c;重建统一的信息架构体系&#xff0c;重造病人服务环境&#xff0c;向不同类型的医疗机构提供SaaS化HIS服务解决…

业务安全五重价值:防攻击、保稳定、助增收、促合规、提升满意度

目录 防范各类威胁攻击 保障业务的连续性和稳定性 保障业务的合规性 提升企业营收和发展 提升企业满意度和品牌知名度 2023年暑假被“票贩子”和“黄牛”攻陷。他们利用各种手段抢先预约名额&#xff0c;然后加价出售给游客&#xff0c;导致了门票供不应求的局面&#xff…

[42000][923] ORA-00923: 未找到要求的 FROM 关键字

在oracle数据库写分页查询&#xff0c;使用 rownum时候出错&#xff0c; 代码&#xff1a; SELECT *FROM (SELECT *, ROWNUM AS rnumFROM test t ) WHERE rnum BETWEEN 1 AND 5; 报错&#xff1a; [42000][923] ORA-00923: 未找到要求的 FROM 关键字 Position: 31 问题原因…

1014蓝桥算法双周赛,学习算法技巧,助力蓝桥杯

家人们&#xff0c;我来免费给大家送福利了&#xff01;&#xff01;&#xff01; 【1014蓝桥算法双周赛 】 背景 蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心举办的全国性IT学科赛事。参赛高校超过1200余所&#xff0c;累计参赛人数超过40万人。该…

如何理解BFC、开启BFC、BFC解决哪些问题

1.BFC 概念 BFC 英文名为 Block Formatting Context (块级格式化上下文) 具体可查看 MDN 2.BFC的作用 元素开启BFC后&#xff0c;子元素不会发生margin塌陷问题元素开启BFC后&#xff0c;子元素浮动&#xff0c;元素不发生高度塌陷元素开启BFC后&#xff0c;该元素不被其他元…

java案例RSA分段加密解密,签名验签,公钥加密私钥解密,私钥加密公钥解密,解密乱码怎么解决

一. 原理 非对称加密算法是一种密钥的保密方法。 非对称加密算法需要两个密钥&#xff1a;公开密钥&#xff08;publickey:简称公钥&#xff09;和私有密钥&#xff08;privatekey:简称私钥&#xff09;。公钥与私钥是一对&#xff0c;如果用公钥对数据进行加密&#xff0c;只…

纯 CSS 实现瀑布流布局的方法

纯 CSS 实现瀑布流布局的方法 这种方式兼容性不是很好&#xff0c;全部支持需要些时间&#xff0c;但是目前是可以使用 css 写出来的 display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 10px; grid-template-rows: masonry;全部的 css .container {display:…

凉鞋的 Godot 笔记 108. 第二个通识:增删改查

在这一篇&#xff0c;我们来学习此教程的第二个通识&#xff0c;即&#xff1a;增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景窗口中&#xff0c;我们是对 Node 进行增删改查。 在文件系统窗口中&#xff0c;我们是对文件&文件夹进行增删改查&#xff1…

【单片机】18-红外线遥控

一、红外遥控背景知识 1.人机界面 &#xff08;1&#xff09;当面操作&#xff1a;按键&#xff0c;旋转/触摸按键&#xff0c;触摸屏 &#xff08;2&#xff09;遥控操作&#xff1a;红外遥控&#xff0c;433M/2.4G无线通信【穿墙能力强】&#xff0c;蓝牙-WIFI-Zigbee-LoRa等…

jupyter 切换虚拟环境

当前只有两个环kernel 我已经创建了很多虚拟环境&#xff0c;如何在notebook中使用这些虚拟环境呢&#xff1f;请看下面 比如说我要添加nlp 这个虚拟环境到notebook中 1. 切换到nlp环境 2. 安装如下模块 pip install ipykernel 3. 执行如下命令 python -m ipykernel install …

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…