在流程中,最重要的参与者是用户。流程定义了任务何时需要用户参与,什么用户可以参与。

  组可以理解为我们常说的角色。

  Flowable中内置了一套简单的对用户和组的支持,身份管理(IDM IDentity Management),但从Flowable V6起,该组件从Flowable引擎模块中抽出。这是因为它不是Flowable引擎的核心内容,而且在很多企业应用中,常常需要结合现有应用系统的用户和组,并不使用或需要Flowable提供的用户和组。

一、BPMN2.0 指派用户和组

  用户和组主要在用户任务(user task)中使用。当流程执行到达用户任务时,会为指派至该任务的用户或组的任务列表添加一个新任务。

1.1 指派用户

  用户任务可以直接指派(assign)给用户。

    <userTask id="theTask" name="重要任务">
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>jinyangjie</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>

  只能指定一个用户作为任务的humanPerformer。在Flowable术语中,这个用户被称作办理人(assignee)。拥有办理人的任务,在其他人的任务列表中不可见,而只能在该办理人的个人任务列表中看到。

  上面的标准用法比较笨重,使用Flowable自定义扩展以减少复杂度。

	<userTask id="theTask" name="重要任务" flowable:assignee="jinyangjie"/>

  通过TaskService获取指定用户待办理的任务

	List<Task> tasks = taskService.createTaskQuery().taskAssignee("jinyangjie").list();

1.2 指派潜在用户

  有时候,我们并不知道任务的具体办理人是谁,但知道哪些人是潜在的办理者。比如请假申请时,我们可以向部门经理或者项目经理申请,只要他们中的一个办理审批即可。

  在流程中,使用potentialOwner(潜在用户)结构指派用户的候选任务列表。

    <userTask id='theTask' name='重要任务' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>

  Flowable自定义扩展:

	<userTask id="theTask" name="重要任务" flowable:candidateUsers="jinyangjie, zhangsan" />

  获取潜在任务,或者说候选任务列表的方法:

	List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("jinyangjie");

  在候选列表中,当其中一个潜在用户申领(claim)任务后,即代表该任务已经指定由申领人办理。

1.3 指派潜在组

    <userTask id='theTask' name='重要任务' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>

  Flowable自定义扩展:

	<userTask id="theTask" name="重要任务" flowable:candidateGroups="leader, manager" />

  获取潜在组任务列表方法:

	List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("leader");

1.4 指派潜在用户和组

    <userTask id='theTask' name='重要任务' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie), group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>

  如果并未指定给定字符串是用户还是组,引擎默认其为组。

二、IDM

  IDM(身份管理 IDentity Management)是Flowable提供的用户和组的管理组件。

  默认情况下,IDM引擎在Flowable引擎启动时初始化并启动。IDM引擎管理自己的数据库表结构及下列实体:

  • User与UserEntity,用户信息。
  • Group与GroupEntity,组信息。
  • MembershipEntity,组中的用户成员。
  • Privilege与PrivilegeEntity,权限定义(例如在Flowable Modeler与Flowable Task应用中,用于控制应用界面的访问)。
  • PrivilegeMappingEntity,将用户及/或组与权限关联。
  • Token与TokenEntity,应用界面程序使用的认证令牌。

  历史与当前进行中的流程实例都在数据库中保存历史实体,因此可以选择直接查询历史表,以减少对运行时流程实例数据的访问,并提高运行时执行的性能。

三、自定义指派用户和组

  实际应用中,我们需要自定义指派用户和组,下面我们通过任务监听器实现自定义指派。

  在用户任务上添加创建事件(create event)类型的监听器,调用自定义指派逻辑:

    <userTask id="task1" name="我的任务" >
<extensionElements>
<flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" />
</extensionElements>
</userTask>

  传递至TaskListener的DelegateTask,可用于设置办理人与候选用户/组:

    public class MyAssignmentHandler implements TaskListener {

      public void notify(DelegateTask delegateTask) {
// 在这里执行自定义身份查询 // 然后调用如下命令:
delegateTask.setAssignee("jinyangjie");
delegateTask.addCandidateUser("zhangsan");
delegateTask.addCandidateGroup("leader");
...
} }

四、小结

  事实上,Flowable在运行时并不做任何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户。这给我们留下了很大自定义用户和组的空间,这样当我们将Flowable嵌入应用时,可以与应用已有的用户和组结合使用,也可以结合LDAP、Active Directory等服务使用。后续篇章中,我们将会介绍Flowable与LDAP的集成。

Flowable实战(七)用户和组的更多相关文章

  1. 2017.2.28 activiti实战--第五章--用户与组及部署管理(三)部署流程及资源读取

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(三)部署流程及资源读取 内容概览:如何利用API读取已经部署的资源,比如读取流程定义的XML文件,或流程对应的图片文件. 以 ...

  2. 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...

  3. 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...

  4. linux学习16 Linux用户和组管理命令演练和实战应用

    一.上集回顾 1.bash globing,IO重定向及管道 glob:*,?,[],[^] IO重定向: >,>>, 2>,2>> &>,& ...

  5. MongoDB的真正性能-实战百万用户

    阅读目录 一.第一个问题:Key-Value数据库可以有好多的Key,没错,但对MongoDB来说,大错特错 二.第二个问题:FindOne({_id:xxx})就快么? 三.第三个问题:精细的使用U ...

  6. linux用户和组管理,/etc/passwd 、/etc/shadow和/etc/group 文件内容解释

    与用户相关的系统配置文件主要有/etc/passwd 和/etc/shadow,其中/etc/shadow是用户资讯的加密文件,比如用户的密码口令的加密保存等: /etc/passwd 和/etc/s ...

  7. Solaris用户管理(一):用户与组管理

    Solaris用户管理(一):用户与组管理  2008-07-01 09:19 用户管理是系统管理的基础.Solaris中不但支持传统Unix所支持的用户和组的概念,还从Solaris 8开始引入了基 ...

  8. centos7用户,组及文件权限管理

    centos7安装过程中如果没有创建用户的话,默认只有ROOT用户,这个用户是具有最高权限的帐户,可以做任何事情,但实际生产环境中我们一般不会使用这个用户,因为权限太大了,很危险. 所以在生产环境中就 ...

  9. Linux系统下用户与组的管理

    Linux系统下用户与组的管理 一.用户及组基本概述 Linux 系统上,用户管理是基于用户名和密码的方式进行资源的分配. 1.uid(用户身份标识) (1)root用户 uid为0 (2)普通用户: ...

随机推荐

  1. 2020KCTF秋季赛签到题

    比赛平台:https://ctf.pediy.com/game-season_fight-158.htm 开场 签到题 例行检查,64位程序,无壳 试运行一下,看看大概的情况 64位ida载入,根据运 ...

  2. [BUUCTF]REVERSE——[ACTF新生赛2020]usualCrypt

    [ACTF新生赛2020]usualCrypt 附件 步骤: 例行检查,无壳,32位程序 32位ida载入,直接看main函数 逻辑很简单,一开始让我们输入一个字符串,然后该字符串经过sub_4010 ...

  3. Position定位详解

    Position CSS position属性用于指定一个元素在文档中的定位方式.top,right,bottom 和 left 属性则决定了该元素的最终位置. 在分析position元素定位之前,先 ...

  4. python enumerate枚举用法总结

    enumerate()说明 enumerate()是python的内置函数enumerate在字典上是枚举.列举的意思对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumer ...

  5. c++设计模式概述之工厂

    类写的不规范,原因: 缩短篇幅,实际中请不要这样写. 欢迎指正 工厂模式,如其名,想象下现实生活中的工厂,比如Apple的组装工厂,小米产品的组装工厂,华为设备的组装工厂.对我们用户而言,不需要知道他 ...

  6. 【LeetCode】242. Valid Anagram 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 字典统计词频 排序 日期 [LeetCode] 题目地址:ht ...

  7. 【LeetCode】376. Wiggle Subsequence 解题报告(Python)

    [LeetCode]376. Wiggle Subsequence 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.c ...

  8. 【LeetCode】889. Construct Binary Tree from Preorder and Postorder Traversal 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 1742 开心的小Q

    如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...

  10. 如何让 Spring Security 「少管闲事」

    记两种让 Spring Security「少管闲事」的方法. 遇到问题 一个应用对外提供 Rest 接口,接口的访问认证通过 Spring Security OAuth2 控制,token 形式为 J ...