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