[8]深入浅出工作开源框架Camunda:用户查看任务权限控制

Posted 朱清云的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[8]深入浅出工作开源框架Camunda:用户查看任务权限控制相关的知识,希望对你有一定的参考价值。

在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;
/**
 * <p>The set of built-in @link Resource names.</p>
 *
 * @author Daniel Meyer
 *
 */
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;
/**
 * @author Sebastian Menski
 */
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,那么其就只能看到制定的任务。我们可以把这个功能用于任务的传阅:即当前用户只能查看,不能对当前的任务做任何改动操作~

以上是关于[8]深入浅出工作开源框架Camunda:用户查看任务权限控制的主要内容,如果未能解决你的问题,请参考以下文章

[10]深入浅出工作开源框架Camunda:赋予用户修改当前任务执行人的权限

[10]深入浅出工作开源框架Camunda:赋予用户修改当前任务执行人的权限

[9]深入浅出工作开源框架Camunda:流程部署和流程启动权限控制

[9]深入浅出工作开源框架Camunda:流程部署和流程启动权限控制

[14]深入浅出工作开源框架Camunda:多实例串行用户任务

[14]深入浅出工作开源框架Camunda:多实例串行用户任务