一 代码
package com.syc.activiti;
import java.util.List;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.IdentityLink;
/**
* 查询流程定义的权限数据
*
*/
public class CandidateQuery {
public static void main( String[] args ) {
// 创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 得到流程存储服务实例
RepositoryService repositoryService = engine.getRepositoryService();
// 得到身份服务组件
IdentityService identityService = engine.getIdentityService();
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/candidateQuery.bpmn").deploy();
// 添加2个用户
creatUser(identityService, "user1", "张三", "张三", "mail1", "123");
creatUser(identityService, "user2", "李四", "李四", "mail2", "123");
// 添加2个用户组
createGroup(identityService, "group1", "经理组", "manager");
createGroup(identityService, "group2", "员工组", "employee");
// 查询流程定义
ProcessDefinition def = repositoryService
.createProcessDefinitionQuery().deploymentId(dep.getId())
.singleResult();
// 设置权限数据
repositoryService.addCandidateStarterGroup(def.getId(), "group1");
repositoryService.addCandidateStarterGroup(def.getId(), "group2");
repositoryService.addCandidateStarterUser(def.getId(), "user1");
repositoryService.addCandidateStarterUser(def.getId(), "user2");
// 根据用户查询用权限的流程定义
List<ProcessDefinition> defs = repositoryService
.createProcessDefinitionQuery().startableByUser("user1").list();
System.out.println("用户张三有权限的流程定义为:");// 结果为1
for (ProcessDefinition dft : defs) {
System.out.println(" " + dft.getName());
}
// 根据流程定义查询用户组数据
List<Group> groups = identityService.createGroupQuery()
.potentialStarter(def.getId()).list();
System.out.println("以下用户组对流程定义有权限:");
for (Group group : groups) {
System.out.println(" " + group.getName());
}
// 根据流程定义查询用户数据
List<User> users = identityService.createUserQuery()
.potentialStarter(def.getId()).list();
System.out.println("以下用户对流程定义有权限:");// 结果为2
for (User user : users) {
System.out.println(" " + user.getFirstName());
}
// 根据流程定义查询全部的 IdentityLink(ACT_RU_IDENTITYLINK表) 数据
List<IdentityLink> links = repositoryService
.getIdentityLinksForProcessDefinition(def.getId());
System.out.println("与流程定义相关的数据量: " + links.size());// 结果为4
}
// 将用户组数据保存到数据库中
static void createGroup( IdentityService identityService, String id,
String name, String type ) {
// 调用newGroup方法创建Group实例
Group group = identityService.newGroup(id);
group.setName(name);
group.setType(type);
identityService.saveGroup(group);
}
// 创建用户方法
static void creatUser( IdentityService identityService, String id,
String first, String last, String email, String passwd ) {
// 使用newUser方法创建User实例
User user = identityService.newUser(id);
// 设置用户的各个属性
user.setFirstName(first);
user.setLastName(last);
user.setEmail(email);
user.setPassword(passwd);
// 使用saveUser方法保存用户
identityService.saveUser(user);
}
}
二 流程文件
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="vacationProcess" name="vacation">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="Write Vacation"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow1" name="" sourceRef="startevent1"
targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" name="" sourceRef="usertask1"
targetRef="endevent1"></sequenceFlow>
</process>
</definitions>
三 运行结果
用户张三有权限的流程定义为:
vacation
以下用户组对流程定义有权限:
经理组
员工组
以下用户对流程定义有权限:
张三
李四
与流程定义相关的数据量: 4
四 数据库
1 act_re_deployment
mysql> select * from act_re_deployment;
+-------+-------+-----------+------+------------+-------------------------+-----------------+
| ID_ | NAME_ | CATEGORY_ | KEY_ | TENANT_ID_ | DEPLOY_TIME_ | ENGINE_VERSION_ |
+-------+-------+-----------+------+------------+-------------------------+-----------------+
| 67501 | NULL | NULL | NULL | | 2020-04-18 11:18:11.614 | NULL |
+-------+-------+-----------+------+------------+-------------------------+-----------------+
1 row in set (0.00 sec)
2 act_re_procdef
mysql> select * from act_re_procdef;
+-------------------------+------+------------------------------+----------+-----------------+----------+----------------+--------------------------+---------------------+--------------+---------------------+-------------------------+-------------------+------------+-----------------+
| ID_ | REV_ | CATEGORY_ | NAME_ | KEY_ | VERSION_ | DEPLOYMENT_ID_ | RESOURCE_NAME_ | DGRM_RESOURCE_NAME_ | DESCRIPTION_ | HAS_START_FORM_KEY_ | HAS_GRAPHICAL_NOTATION_ | SUSPENSION_STATE_ | TENANT_ID_ | ENGINE_VERSION_ |
+-------------------------+------+------------------------------+----------+-----------------+----------+----------------+--------------------------+---------------------+--------------+---------------------+-------------------------+-------------------+------------+-----------------+
| vacationProcess:1:67503 | 1 | http://www.activiti.org/test | vacation | vacationProcess | 1 | 67501 | bpmn/candidateQuery.bpmn | NULL | NULL | 0 | 0 | 1 | | NULL |
+-------------------------+------+------------------------------+----------+-----------------+----------+----------------+--------------------------+---------------------+--------------+---------------------+-------------------------+-------------------+------------+-----------------+
1 row in set (0.00 sec)
3 act_id_user
mysql> select * from act_id_user;
+-------+------+--------+--------+--------+------+-------------+
| ID_ | REV_ | FIRST_ | LAST_ | EMAIL_ | PWD_ | PICTURE_ID_ |
+-------+------+--------+--------+--------+------+-------------+
| user1 | 1 | 张三 | 张三 | mail1 | 123 | NULL |
| user2 | 1 | 李四 | 李四 | mail2 | 123 | NULL |
+-------+------+--------+--------+--------+------+-------------+
4 act_id_group
mysql> select * from act_id_group;
+--------+------+-----------+----------+
| ID_ | REV_ | NAME_ | TYPE_ |
+--------+------+-----------+----------+
| group1 | 1 | 经理组 | manager |
| group2 | 1 | 员工组 | employee |
+--------+------+-----------+----------+
2 rows in set (0.00 sec)
5 act_ge_bytearray
6 act_ru_identitylink
mysql> select * from act_ru_identitylink;
+-------+------+-----------+-----------+----------+----------+---------------+-------------------------+
| ID_ | REV_ | GROUP_ID_ | TYPE_ | USER_ID_ | TASK_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ |
+-------+------+-----------+-----------+----------+----------+---------------+-------------------------+
| 67504 | 1 | group1 | candidate | NULL | NULL | NULL | vacationProcess:1:67503 |
| 67505 | 1 | group2 | candidate | NULL | NULL | NULL | vacationProcess:1:67503 |
| 67506 | 1 | NULL | candidate | user1 | NULL | NULL | vacationProcess:1:67503 |
| 67507 | 1 | NULL | candidate | user2 | NULL | NULL | vacationProcess:1:67503 |
+-------+------+-----------+-----------+----------+----------+---------------+-------------------------+
4 rows in set (0.00 sec)