前面我们提到,模块a-flow提供了全局Bean组件flow,在这里说明flow提供的与安全沙箱有关的方法
背景
流程定义可以通过listener机制扩展流程运行逻辑。listener中的JS脚本放入安全沙箱中执行,只能访问受控的资源,从而确保流程运行的安全性。再比如,活动节点和转移线配置中的conditionExpression也在安全沙箱中进行计算
- 关于
安全沙箱的底层概念,请参见:Node - VM
src/module-system/a-flow/backend/src/bean/bean.flow.js
- evaluateExpression
在安全沙箱中执行JS脚本
evaluateExpression({ expression, globals })
| 名称 | 可选 | 说明 |
|---|---|---|
| expression | JS脚本 | |
| globals | 是 | 注入安全沙箱中的全局变量 |
- executeService
在安全沙箱中执行flow.serviceBean组件
async executeService({ bean, parameterExpression, parameter, globals })
| 名称 | 可选 | 说明 |
|---|---|---|
| bean | Bean组件:{module, name} | |
| parameterExpression | 是 | 参数的JS脚本,如果指定了parameterExpression,会自动进行安全沙箱计算,生成parameter |
| parameter | 是 | 可以直接传入参数 |
| globals | 是 | 注入安全沙箱中的全局变量 |
flow.serviceBean组件
为了在保证安全的基础上,提升灵活性和可扩展性,允许在系统中提供flow.serviceBean组件,然后在安全沙箱中调用
- 规范
flow.serviceBean组件有如下三个规范:
场景必须是flow.service- 派生自基类
ctx.app.meta.FlowServiceBase - 提供方法
execute
- 演示
下面,以模块test-flow为例,演示如何创建一个flow.serviceBean组件
- 定义Bean组件
src/module/test-flow/backend/src/bean/flow.service.test.js
module.exports = ctx => {
class FlowService extends ctx.app.meta.FlowServiceBase {
async execute(context) {
// parameter
const parameter = context.parameter;
// set var
context.contextNode.vars.set('echo', parameter);
// return
return parameter;
}
}
return FlowService;
};
| 名称 | 说明 |
|---|---|
| context.parameter | 外部传入的参数 |
| context.contextNode | 活动节点的环境对象 |
- 注册Bean组件
src/module/test-flow/backend/src/beans.js
const flowServiceTest = require('./bean/flow.service.test.js');
module.exports = app => {
const beans = {
// flow
'flow.service.test': {
mode: 'ctx',
bean: flowServiceTest,
},
};
return beans;
};
| 注册名称 | 场景 | 所属模块 | global | beanFullName |
|---|---|---|---|---|
| test | flow.service | test-flow | false | test-flow.flow.service.test |
评论: