在Camunda的WebApp中,其是通过管理员的认证授权来实现的。默认情况下,新建的用户是没有任何权限的。比如咱们创建一个用户user2 当用户user2登录后,其登录页面是一个空白的页面,如下图示意。 即使当前启动了一个流程,而且流程里面有一个任务就需要user2来处理,其登录进来后还是上面的页面。那在给User2授权之前,数据库里面发生了什么事情呢?我们可以看到数据库的ACT_RU_AUTHORIZATION表新增了一条数据。
select * from ACT_RU_AUTHORIZATION where USER_ID_ ='user2'
同时在认证授权界面,其也会多出一条记录。从上面来看,其Resource Type的值为7,那么不同的数值到底代表什么意思呢? 咱们可以找出Camunda的代码查看。“7”代表的是用户任务。
package org.camunda.bpm.engine.authorization;
import org.camunda.bpm.engine.EntityTypes;
public enum Resources implements Resource {
APPLICATION(EntityTypes.APPLICATION, 0),
USER(EntityTypes.USER, 1),
GROUP(EntityTypes.GROUP, 2),
GROUP_MEMBERSHIP(EntityTypes.GROUP_MEMBERSHIP, 3),
AUTHORIZATION(EntityTypes.AUTHORIZATION, 4),
FILTER(EntityTypes.FILTER, 5),
PROCESS_DEFINITION(EntityTypes.PROCESS_DEFINITION, 6),
TASK(EntityTypes.TASK, 7),
PROCESS_INSTANCE(EntityTypes.PROCESS_INSTANCE, 8),
DEPLOYMENT(EntityTypes.DEPLOYMENT, 9),
DECISION_DEFINITION(EntityTypes.DECISION_DEFINITION, 10),
TENANT(EntityTypes.TENANT, 11),
TENANT_MEMBERSHIP(EntityTypes.TENANT_MEMBERSHIP, 12),
BATCH(EntityTypes.BATCH, 13),
DECISION_REQUIREMENTS_DEFINITION(EntityTypes.DECISION_REQUIREMENTS_DEFINITION, 14),
REPORT(EntityTypes.REPORT, 15),
DASHBOARD(EntityTypes.DASHBOARD, 16),
OPERATION_LOG_CATEGORY(EntityTypes.OPERATION_LOG_CATEGORY, 17),
@Deprecated
OPTIMIZE(EntityTypes.OPTIMIZE, 18),
HISTORIC_TASK(EntityTypes.HISTORIC_TASK, 19),
HISTORIC_PROCESS_INSTANCE(EntityTypes.HISTORIC_PROCESS_INSTANCE, 20),
SYSTEM(EntityTypes.SYSTEM, 21);
String name;
int id;
Resources(String name, int id) {
this.name = name;
this.id = id;
}
public String resourceName() {
return name;
}
public int resourceType() {
return id;
}
}
其资源的实体类型的枚举如下:
package org.camunda.bpm.engine;
public class EntityTypes {
public static final String APPLICATION = "Application";
public static final String ATTACHMENT = "Attachment";
public static final String AUTHORIZATION = "Authorization";
public static final String FILTER = "Filter";
public static final String GROUP = "Group";
public static final String GROUP_MEMBERSHIP = "Group membership";
public static final String IDENTITY_LINK = "IdentityLink";
public static final String TASK = "Task";
public static final String HISTORIC_TASK = "HistoricTask";
public static final String USER = "User";
public static final String PROCESS_INSTANCE = "ProcessInstance";
public static final String HISTORIC_PROCESS_INSTANCE = "HistoricProcessInstance";
public static final String PROCESS_DEFINITION = "ProcessDefinition";
public static final String JOB = "Job";
public static final String JOB_DEFINITION = "JobDefinition";
public static final String VARIABLE = "Variable";
public static final String DEPLOYMENT = "Deployment";
public static final String DECISION_DEFINITION = "DecisionDefinition";
public static final String CASE_DEFINITION = "CaseDefinition";
public static final String EXTERNAL_TASK = "ExternalTask";
public static final String TENANT = "Tenant";
public static final String TENANT_MEMBERSHIP = "TenantMembership";
public static final String BATCH = "Batch";
public static final String DECISION_REQUIREMENTS_DEFINITION = "DecisionRequirementsDefinition";
public static final String DECISION_INSTANCE = "DecisionInstance";
public static final String REPORT = "Report";
public static final String DASHBOARD = "Dashboard";
public static final String METRICS = "Metrics";
public static final String TASK_METRICS = "TaskMetrics";
public static final String CASE_INSTANCE = "CaseInstance";
public static final String PROPERTY = "Property";
public static final String OPERATION_LOG_CATEGORY = "OperationLogCatgeory";
public static final String OPTIMIZE = "Optimize";
public static final String OPERATION_LOG = "OperationLog";
public static final String INCIDENT = "Incident";
public static final String SYSTEM = "System";
}
那么如何才能让user2能够看到自己的任务呢?这个时候就需要借助于Camunda的权限管理。管理员登录权限控制系统,然后在权限控制里面添加用户user2可以查看任务。 但是即使赋予了user2查看任务的权限之后,即使当前有任务需要user2处理,其还是不能查询除任何的任务。 这个时候,还需要赋予给user2的任务查询权限。 这个时候user2就能查看到用户任务。
在回到数据库表来看user2的权限记录,总共有三条记录,其资源类型(resource_type)的值为0,5,7;
APPLICATION(EntityTypes.APPLICATION, 0),
FILTER(EntityTypes.FILTER, 5),
TASK(EntityTypes.TASK, 7),
分别代表:
上面当有任务流转到用户的时候,如何进行权限设置,才能让user2看到其需要处理的任务并进行处理!但是由的时候,需要让user2能够看到虽然不是他自己审批的,但是他能看到所有的还未完成的流程的任务,或者指定的任务;这个时候应该如何做呢? 比如说,当前有一个任务是要由user1来处理,我们登录到user2的账户并来到task列表的页面。我们发现user2的里面没有任何的有关user1的任务。 这个时候,我给user2加一个查看所有任务的权限。
这个时候,我们在来刷新user2的用户任务列表,我们发现用户user2能看到所有的任务了! 上图可以知道,其实user2看到的是user1当前的任务~
当前,也可以在分配权限的时候,指定具体的任务ID,那么其就只能看到制定的任务。我们可以把这个功能用于任务的传阅:即当前用户只能查看,不能对当前的任务做任何改动操作~
|