JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权

原创 2007年09月27日 19:22:00

JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权

在JBPM中定义了一个简单的?Role-〉User的用户模型。但是在实际项目中,我们的用户模型可能远比这个模型复杂,或者有很大的差异。所以也就有了这篇文章的主题。

这篇文章是受一名QQ昵称为“老结赖”的朋友的托付写的,希望可以帮到他。

言归正传,在JBPM中是通过Actor和PooledActor来对任务进行授权的。其中也牵涉到了Swimlane的概念(具体概念会在另一片文章中说明)。由于在JBPM中并没有把Task的授权强行跟Actor和PooledActor进行关联,这也就让我们嵌入自己的用户模型成为了可能。

废话少说,先给出一个示例流程:

 

代码
 
  1.   
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3.   
  4. <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">  
  5.   
  6.     <start-state name="启动">  
  7.         <transition name="" to="制单"></transition>  
  8.     </start-state>  
  9.   
  10.     <task-node name="制单">  
  11.         <task name="制单">  
  12.             <assignment actor-id="#{processStarter}"></assignment>  
  13.         </task>  
  14.         <transition name="送复核" to="复核"></transition>  
  15.     </task-node>  
  16.   
  17.     <task-node name="复核">  
  18.         <task name="复核">  
  19.             <assignment class="com.sky.plugin.jbpm.def.ActorsHandel">  
  20.             </assignment>  
  21.         </task>  
  22.         <transition name="拒绝复核" to="制单"></transition>  
  23.         <transition name="提交审批" to="审批"></transition>  
  24.     </task-node>  
  25.   
  26.     <task-node name="审批">  
  27.         <task name="审批">  
  28.             <assignment class="com.sky.plugin.jbpm.def.ActorsHandel">  
  29.             </assignment>  
  30.         </task>  
  31.         <transition name="同意" to="结束">  
  32.         <transition name="拒绝到复核人" to="复核"></transition>  
  33.     </task-node>  
  34.        
  35.     <end-state name="结束"></end-state>  
  36.        
  37. </process-definition>  
  38.   

 

其中有几点地方是我们要注意到的,也就是我们实现自定义用户模型需要做到的地方。在这里先提一下,然后再一一解释。


  • 1. <assignment actor-id="#{processStarter}"></assignment> 确定流程的发起者
    2. <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"> 通过AssignHandler动态的对流程实例定义Actor

 

流程中,通过一个变量#{processStarter}来对整个流程的第一个Task进行授权,那么这个授权是在启动流程的时候一起进行的。也就是说这个#{processStarter}的值应该是系统中启动流程的当前用户。

启动流程代码如下:

代码
 
  1. public Long startProcess(final Long processDefinitionId,   
  2.         final String username) {   
  3.     return (Long)jbpmTemplate.execute(new JbpmCallback() {   
  4.   
  5.         public Object doInJbpm(JbpmContext jbpmContext)   
  6.                 throws JbpmException {   
  7.             GraphSession graphSession = jbpmContext.getGraphSession();   
  8.             ProcessDefinition processDefinition = graphSession   
  9.                     .loadProcessDefinition(processDefinitionId);   
  10.   
  11.             ProcessInstance processInstance = new ProcessInstance(   
  12.                     processDefinition);   
  13.             //设置流程发起人   
  14.             processInstance.getContextInstance().setVariable("processStarter",username);   
  15.                
  16.             processInstance.signal();   
  17.             TaskInstance taskInstance = (TaskInstance) processInstance   
  18.                     .getTaskMgmtInstance().getTaskInstances().iterator()   
  19.                     .next();   
  20.             taskInstance.setActorId(username);   
  21.             taskInstance.setVariable("processStarter",username);   
  22.   
  23.             // taskInstance.end();   
  24.             // Save the process instance along with the task instance   
  25.             jbpmContext.save(processInstance);   
  26.                
  27.             return processInstance.getId();   
  28.         }   
  29.   
  30.     });   
  31. }  

注:其中processInstance.getContextInstance().setVariable("processStarter",username);则是把系统当前用户设置到流程中。这里有一点跟别的地方不一样的地方,那就是这个流程没有<startTask></startTask>,而是用一个TaskNode作为startTask,这里是由于我的系统中有特殊的要求。如果你不需要的话,你可以用startTask代替,都是一样的处理。

 

接着,进入最关键的部分,也就是真正实现Task的用户可配置,这样的话,需要额外的维护一张Task和自定义用户模型中user的映射表。

映射表结构如下:

id---processDefinitionId---taskId---taskName---actors
1----------1--------------------------1--------制单--------1001
2----------1--------------------------2--------复核--------1002,1003
3----------1--------------------------3--------审批--------1004,1005,1006

其它字段的意思就不用说了,其中actors字段就是你用户模型中的用户名或者userId。[b当然这里是很灵活的,如果你要和你系统中的Role绑定,也同样可以这样实现,只要变通一点就OK了,这里就不罗嗦了。

下面进入最重要的部分,也就是通过AssignHandler进行动态授权。代码如下:

代码
 
  1. package com.sky.plugin.jbpm.def;   
  2.   
  3. public class ActorsHandel implements AssignmentHandler {   
  4.   
  5.     private static final long serialVersionUID = 1L;   
  6.   
  7.     public void assign(Assignable assignable, ExecutionContext context)   
  8.             throws Exception {   
  9.   
  10.         ProcessDefinition processDefinition = context.getProcessDefinition();   
  11.         TaskInstance taskInstance = context.getTaskInstance();   
  12.         Task task = taskInstance.getTask();   
  13.   
  14.         Long processDefinitionId = processDefinition.getId();   
  15.         Long taskId = task.getId();   
  16.            
  17.         //读取数据库该任务的授权,分配给该任务Task,也就是前面那张表中的记录   
  18.         //ps.loadTaskActors(processDefinitionId, taskId)是自定义方法用来读取   
  19.         //授权信息   
  20.            
  21.         ServiceFactory serviceFactory = ServiceFactory.getInstance();   
  22.         ProcessService ps = serviceFactory.getProcessService();   
  23.         String[] actors = ps.loadTaskActors(processDefinitionId, taskId);   
  24.         assignable.setPooledActors(actors);   
  25.     }   
  26. }  

 

这样就完成了Jbpm同自定义用户模型的绑定,以后就是处理Task了,但是这里只是简单的实现,还有很多的东西需要注意。比如:流程被打回(审批不通过),只能回到前一个提交的人那里,而不是第一次流程定义的所有的actors等等问题。这个问题我将在“JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(2)”中进行说明。

 

JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)

博客分类: JBPM JBPMMySQLQQ配置管理项目管理 在JBPM中定义了一个简单的?Role-〉User的用户模型。但是在实际项目中,我们的用户模型可能远比这个模型复杂,或者有很大的差异...

利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思

Jbpm4提供的IdentitySession接口并不是一种很好的处理方式,鉴于我们每个业务系统都有一套自己的用户及权限认证管理机制,需要与jbpm4.4集成的话,就比较周折了,我们经常需要查询的就是...

利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思

Jbpm4提供的IdentitySession接口并不是一种很好的处理方式,鉴于我们每个业务系统都有一套自己的用户及权限认证管理机制,需要与jbpm4.4集成的话,就比较周折了,我们经常需要查询的就是...
  • fhx007
  • fhx007
  • 2011年02月22日 11:37
  • 4601

springmvc自定义参数绑定用户信息

通常,我们会把用户信息存放在session里面作为一个属性。就像这样。session.setAttribute(“userinfo”,userinfo)。但是这样做每次在方法前必须要先从request...

PSASP7.0版用户自定义(UD)模型手册

  • 2017年08月03日 10:21
  • 6.37MB
  • 下载

微信公众号开发——网页授权实现简化用户绑定

使用网面授权实现简化的微信用户绑定流程开发。
  • xfsnow
  • xfsnow
  • 2016年03月13日 22:37
  • 5975

调用微信OAuth2.0网页授权接口实现用户信息的绑定

在微信网页开发中,可以通过OAuth2.0网页授权机制,来获取用户基本信息,进而实现自己的业务逻辑。 微信官方文档 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要先...

【代码生成】如何生成自定义表单?(3)---将用户模型及注解转换成为表单数据

【其实说起来也没什么复杂的,无非是用反射将模型的所有字段过一次,然后逐个字段检查,看看上面附有什么样的注解信息,顺便将它们放进验证规则里面】 【至于编写模板,将模型字段都转换成为表单信息后,...
  • cdnight
  • cdnight
  • 2013年05月11日 04:52
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权
举报原因:
原因补充:

(最多只允许输入30个字)