errors
Failed to load YAML frontmatter: (<unknown>): mapping values are not allowed in this context at line 2 column 6

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。

3.4.1.1. 规则应用场景

对界面和菜单项的访问,数据模型中实体和属性级别的访问,数据满足某些条件的访问,例如,用户所在部门的权限,开发者可以轻松配置高级访问控制规则,且确保规则完全透明。

3.4.1.2. 规则的定义

一个规则满足说明条件执行上面动作拥有规则的名称,规则描述,以及规则优先级。Codition注解与Action注解是成对出现,必须要有条件动作规则名称。我们可以用规则注解去描述一段业务行为,例如控制权限,对用户以及视图,菜单,属性,数据的访问。

3.4.1.3. 什么是规则引擎

使用注解定义规则,引擎提供了一下注解定义,首先,注解都是成对出现,其次,注解定义在类上。

每个注解都有一个Name不能为空,作为唯一凭证。

规则如下所示:

​ ● Name :规则名称

​ ● Description :规则描述

​ ● Priority :规则执行优先级

​ ● @Condition : 为了应用规则而必须满足的一组条件

​ ● @Action : 当条件满足时执行的一组动作

3.4.1.4. 规则注解

Action注解
字段名 中文名 可选值 描述
name 名称 r01 规则名称
resource 静态资源 @Resource 静态资源 菜单、实体、属性这些都属于静态资源
filter 过滤条件 @Filter 过滤条件 条件组合
method 方法调用 @Method 方法调用  
condition 复合条件 & | () & 同时满足执行 | 任意满足执行 括号优先级 填@condition注解上面定义的名称,例如“r01”那么填入r01即可,如果需要多个条件可以用r02&r01即可如果两个条件任意生效可以是r01|ro2 如果必须两边都要执行(r01&r02)| (r03&r04)

代码示例:

@Rules.Condition(scope = ScopeEnum.USER, object = "02hej7bkhto1t", name = "r01")
@Rules.Action(name = "r11", condition = "r01", resources = @Rules.Resource(name = "r02", type = ResourceType.MENU, resource = "base_developer_center"))
Resource注解
字段名 中文名 可选值
type 类型 菜单、视图、属性、服务
action 事件  
resource 资源 meta_model_menu
effect 允许 拒绝、允许
name 名称 r01

代码示例:

@Rules.Action(name = "r02", condition = "r01", resources = {@Rules.Resource(type = ResourceType.MENU, resource = "", name = "r03"), @Rules.Resource(type = ResourceType.MODEL, resource = "", name = "r04")})
Method注解
字段名 中文名 可选值
name 名称  
model 模型名 rbac_user
parameter 参数  
BEA 注入前后 AFTER / BEFORE
methodSrc 方法名 自定义服务名
modelDst 注入模型名 rbac_user
methodDst 注入服务名 aa

代码示例:

@Rules.Action(name = "r02", condition = "r01", methods = {@Rules.Method(modelDst = "rbac_user", model = "rbac_user", methodSrc = "login", methodDst = "aa", name = "r03")})
Filter注解
字段名 中文名 可选值
name 名称  
model 模型名 rbac_user
filter 过滤条件 "name", "like", "%a%"
context 上下文  

代码示例:

@Rules.Action(name = "r02", condition = "r01", filters = {@Rules.Filter(filter = "[['name', 'like', '%a%']]", model = "rbac_user", name = "r03")})
Condition注解
字段名 中文名 可选值
scope 作用域 用户、全局、租户、自定义
object 对象 {"admin"}
name 名称 r01
script 脚本 默认groovy脚本

如下所示是一组规则,r02规则描述用户登录之前先执行xx方法

@Rules.Condition(scope = ScopeEnum.GLOBAL, name = "r02")
@Rules.Action(methods = @Rules.Method(methodDst = "rbac_user.login", methodSrc = "rbac_user.xx"), name = "r02")

如下所示就是一组规则,r01规则描述admin用户不能访问开发者中心,其他菜单可以访问。一组规则必须包含规则名称,规则条件,规则执行动作。

@Rules.Condition(scope = ScopeEnum.USER, object = "admin", name = "r01")
@Rules.Action(resources = @Rules.Resource(type = ResourceType.MENU, resource = "base_developer_center"), name = "r01")