Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Activiti在完成任务之前验证受让人或候选组_Java_Spring_Activiti - Fatal编程技术网

Java Spring Activiti在完成任务之前验证受让人或候选组

Java Spring Activiti在完成任务之前验证受让人或候选组,java,spring,activiti,Java,Spring,Activiti,我正在与SpringAcitViti合作管理项目的工作流。我是Activiti的新手,我正在尝试让它与自定义用户群一起工作。下面是我正在处理的示例项目 目前,我试图限制可以在流程简单测试流程中执行特定任务taskA的用户 调用taskService.completetask.getId Activiti时,似乎完全忽略了任务分配给谁。由于项目中尚未配置安全性,并且taskA被分配给Hello World,因此当匿名用户试图执行它时,它应该会失败 活动是否要求我们在执行任务之前手动检查受让人、候选

我正在与SpringAcitViti合作管理项目的工作流。我是Activiti的新手,我正在尝试让它与自定义用户群一起工作。下面是我正在处理的示例项目

目前,我试图限制可以在流程简单测试流程中执行特定任务taskA的用户

调用taskService.completetask.getId Activiti时,似乎完全忽略了任务分配给谁。由于项目中尚未配置安全性,并且taskA被分配给Hello World,因此当匿名用户试图执行它时,它应该会失败

活动是否要求我们在执行任务之前手动检查受让人、候选用户、候选组

如果不是,那么我们如何使用indicate to Activiti只让特定用户完成任务

包括下面的相关代码 simple-test-process.bpmn图

simple-test-process.bpmn

ActivityStatApplication.java

包com.example; 导入java.util.array; 导入java.util.Collections; 导入java.util.HashMap; 导入java.util.List; 导入java.util.Map; 导入java.util.stream.collector; 导入org.activiti.engine.IdentityService; 导入org.activiti.engine.RuntimeService; 导入org.activiti.engine.TaskService; 导入org.activiti.engine.identity.Group; 导入org.activiti.engine.identity.User; 导入org.activiti.engine.runtime.ProcessInstance; 导入org.activiti.engine.task.task; 导入org.springframework.beans.factory.initializebean; 导入org.springframework.beans.factory.annotation.Autowired; 导入org.springframework.boot.SpringApplication; 导入org.springframework.boot.autoconfigure.springboot应用程序; 导入org.springframework.context.annotation.Bean; 导入org.springframework.stereotype.Component; 导入org.springframework.web.bind.annotation.GetMapping; 导入org.springframework.web.bind.annotation.PathVariable; 导入org.springframework.web.bind.annotation.RestController; @SpringBoot应用程序 公共类活动应用程序{ 公共静态无效字符串[]args{ SpringApplication.RunActivititesApplication.class,args; } @豆子 初始化Bean用户和组初始化最终标识服务标识服务{ 返回->{ Group Group=identityService.newGroupuser; group.setNameusers; group.setTypesecurity-role; identityService.saveGroupgroup; User admin=identityService.newUseradmin; admin.setPasswordadmin; identityService.saveUseradmin; }; } } @RestController 类ProcessRest{ @自动连线 私有RuntimeService RuntimeService; @自动连线 私人任务服务任务服务; @GetMapping/start 公开名单开始{ List photos=Arrays.asListphoto1,photo2; runtimeService.startProcessInstanceByKeysimple-test-process,Collections.Singleton映射照片,照片; long runningProcessCount=runtimeService.createProcessInstanceQuery.count; 列表进程=runtimeService.createProcessInstanceQuery.List; 返回过程 流动 .mapp->getMapp.getId,p.getProcessInstanceId,p.getProcessDefinitionName .toList; } @GetMapping/getTasks/{processInstanceId} 公开名单getTasks@PathVariable字符串处理实例ID{ 列出任务=任务服务 .createTaskQuery .ProcessInstancedProcessInstanceId 列表 返回任务 流动 .mapt->getMapt.getId,t.getProcessInstanceId,t.getName .toList; } @GetMapping/completeTask/{processInstanceId} 公共地图completeNextTask@PathVariable字符串处理实例ID{ Task Task=taskService.createTaskQuery .ProcessInstancedProcessInstanceId .单一结果; iftask==null{ 为此processInstance引发新的RuntimeExceptionNo挂起任务; } System.out.printlnvariables:+task.getProcessVariables; taskService.completetask.getId; 返回getMaptask.getId、task.getProcessInstanceId、task.getName; } 公共映射getMapString id、字符串实例id、字符串名称{ Map Map=新的HashMap; map.putid,id; map.putprocessInstanceId,instanceId; map.putname,name; 返回图; } } @组成部分 类MyService{ 公众照片列表{ 运行Init任务的System.out.println; 福斯特林照片:照片{ System.out.printlnPhoto名称:+photo; } } 公共字符串处理照片列表照片{ 福斯特林照片:照片{ 系统 out.printlnPhoto名称:+photo; } 已处理退货; } }
不幸的是,没有魔法可以帮你做到这一点,所以你需要验证这些东西,比如任务的受让人等等

我打赌你会想要比硬编码的Hello World更动态的东西,所以为了创建更动态的东西,举个简单的例子,我会将你的/开始端点从GET更改为POST,并将受让人作为参数检索

@PostMapping("/start")
public List<Map<String, String>> start(String assignee) {
将bpmn从activiti:assignee=Hello World更改为activiti:assignee=${person}

并添加一个TaskListener,用于验证每个任务的用户权限。
你会发现TaskListener的一个例子

谢谢,我不介意手动操作,只是想确认我没有用错误的方式操作。为了让Activiti与Spring security一起工作,我还需要做些什么吗?我不打算使用Activiti REST API,所有进程都将通过我的自定义端点公开,我用Spring Security保护这些端点就足够了吗?我认为您需要扩展org.activiti.engine.impl.persistence.entity.UserEntityManager,编写与Spring Security相关的东西,并将其与activiti连接起来,以便双方的用户数据相同。我个人在我的项目中没有这样做,所以如果你在这方面遇到困难,我建议你去activiti论坛试试运气。@11维我偶然发现了这只小狗。可能是有助于youThanks的东西,我以前尝试过实现它,我得出结论,因为我在我的项目中实现了Spring安全性,所以我不需要重写这些特定于Activiti的类。这些类仅仅充当Spring安全性的配置,正如您提到的,我也验证过的,活动本身不会自动验证这些类。
Map<String, Object> variables = Collections.singletonMap("photos", photos);
variables.put("person", assignee);