`
美味人间
  • 浏览: 91340 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Activiti 5 自定义用户管理 修改

    博客分类:
  • java
阅读更多

刚接触activiti 5 ,怎么把业务的用户和流程关联起来是个重大的问题,经过探索,得到了实现的方法。

 

1.spring 配置文件

	<!-- Activiti begin -->
	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
		<property name="transactionManager" ref="transactionManager" />
		<property name="databaseSchemaUpdate" value="true" />
		<property name="jobExecutorActivate" value="false" />
		<property name="history" value="full" />
		
		<!-- 自动部署 -->
		<property name="deploymentResources">
			<list>
				<value>classpath*:/deployments/*</value>
			</list>
		</property>
		
		<!-- 自定义表单字段类型 -->
		<property name="customFormTypes">
			<list>
				<bean class="me.kafeitu.demo.activiti.activiti.form.UsersFormType" />
			</list>
		</property>
		
		<property name="customSessionFactories">
			<list>
            	<bean class="com.sanshen.workflow.activiti.CustomUserEntityManagerFactory" />
            	<bean class="com.sanshen.workflow.activiti.CustomGroupEntityManagerFactory" />
			</list>
      </property>
	</bean>

 其中增加了customSessionFactories的配置。

 

2.用户管理和用户组管理工厂类实现org.activiti.engine.impl.interceptor.SessionFactory接口

public class CustomGroupEntityManagerFactory implements SessionFactory {
	private GroupEntityManager groupEntityManager;

	@Autowired
	public void setGroupEntityManager(GroupEntityManager groupEntityManager) {
		this.groupEntityManager = groupEntityManager;
	}

	public Class<?> getSessionType() {
		// 返回原始的GroupEntityManager类型
		return GroupEntityManager.class;
	}

	public Session openSession() {
		// 返回自定义的GroupEntityManager实例
		return groupEntityManager;
	}
}

 

public class CustomUserEntityManagerFactory implements SessionFactory {
	private UserEntityManager userEntityManager;

	@Autowired
	public void setUserEntityManager(UserEntityManager userEntityManager) {
		this.userEntityManager = userEntityManager;
	}

	public Class<?> getSessionType() {
		// 返回原始的UserManager类型
		return UserEntityManager.class;
	}

	public Session openSession() {
		// 返回自定义的UserManager实例
		return userEntityManager;
	}
}

 3.覆盖用户管理和用户组管理的类

/**
 * 
 */
package com.sanshen.workflow.activiti;

import java.util.List;


import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.UserQueryImpl;
import org.activiti.engine.impl.persistence.entity.IdentityInfoEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.impl.persistence.entity.UserEntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;

import com.sanshen.js.service.account.AccountManager;

/**
 * 自定义的Activiti用户管理器
 * 
 * @author dragon
 * 
 */

@Service
public class CustomUserEntityManager extends UserEntityManager {
	private static final Log logger = LogFactory
			.getLog(CustomUserEntityManager.class);

	@Autowired
	private AccountManager accountManager;

	@Override
	public UserEntity findUserById(final String userCode) {
		if (userCode == null)
			return null;

		try {
			UserEntity userEntity = null;
			com.sanshen.js.entity.account.User bUser = accountManager.getUser(Long.valueOf(userCode));
			userEntity = ActivitiUtils.toActivitiUser(bUser);
			return userEntity;
		} catch (EmptyResultDataAccessException e) {
			return null;
		}
	}

	@Override
	public List<Group> findGroupsByUser(final String userCode) {
		if (userCode == null)
			return null;

			List<com.sanshen.js.entity.account.Group> bGroups = accountManager.getUser(Long.valueOf(userCode)).getGroupList();
			
			List<Group> gs = null;
			gs = ActivitiUtils.toActivitiGroups(bGroups);
			return gs;
			
	}

	@Override
	public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId,
			String key) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public List<String> findUserInfoKeysByUserIdAndType(String userId,
			String type) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public long findUserCountByQueryCriteria(UserQueryImpl query) {
		throw new RuntimeException("not implement method.");
	}
}

 

package com.sanshen.workflow.activiti;

import java.util.ArrayList;
import java.util.List;

import org.activiti.engine.identity.Group;
import org.activiti.engine.impl.GroupQueryImpl;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.GroupEntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
@Service
public class CustomGroupEntityManager extends GroupEntityManager {
	private static final Log logger = LogFactory
			.getLog(CustomGroupEntityManager.class);

	@Autowired
	private AccountManager accountManager;

	@Override
	public GroupEntity findGroupById(final String groupCode) {
		if (groupCode == null)
			return null;
		
			try {
				com.sanshen.js.entity.account.Group bGroup = accountManager.getGroupByGroupId(groupCode);
				
				GroupEntity e = new GroupEntity();
				e.setRevision(1);

				// activiti有3种预定义的组类型:security-role、assignment、user
				// 如果使用Activiti
				// Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务
				e.setType("assignment");

				e.setId(bGroup.getGroupId());
				e.setName(bGroup.getName());
				return e;
			} catch (EmptyResultDataAccessException e) {
				return null;
			}
			
	}

	@Override
	public List<Group> findGroupsByUser(final String userCode) {
		if (userCode == null)
			return null;

		List<com.sanshen.js.entity.account.Group> bGroupList = accountManager.getUser(Long.valueOf(userCode)).getGroupList();
		
		List<Group> gs = new ArrayList<Group>();
		GroupEntity g;
		for (com.sanshen.js.entity.account.Group bGroup : bGroupList) {
			g = new GroupEntity();
			g.setRevision(1);
			g.setType("assignment");

			g.setId(bGroup.getGroupId());
			g.setName(bGroup.getName());
			gs.add(g);
		}
		return gs;
	}

	@Override
	public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
		throw new RuntimeException("not implement method.");
	}
}

 其中CustomUserEntityManager和CustomGroupEntityManager有些方法没有实现,所有在使用中要防止调用到那些方法,不然会报错。

提供一个拷贝工具类

public class ActivitiUtils {
	
	public static UserEntity  toActivitiUser(User bUser){
		UserEntity userEntity = new UserEntity();
		userEntity.setId(bUser.getId().toString());
		userEntity.setFirstName(bUser.getName());
		userEntity.setLastName(bUser.getLoginName());
		userEntity.setPassword(bUser.getPassword());
		userEntity.setEmail(bUser.getEmail());
		userEntity.setRevision(1);
		return userEntity;
	}
	
	public static GroupEntity  toActivitiGroup(Group bGroup){
		GroupEntity groupEntity = new GroupEntity();
		groupEntity.setRevision(1);
		groupEntity.setType("assignment");

		groupEntity.setId(bGroup.getGroupId());
		groupEntity.setName(bGroup.getName());
		return groupEntity;
	}
	
	public static List<org.activiti.engine.identity.Group> toActivitiGroups(List<Group> bGroups){
		
		List<org.activiti.engine.identity.Group> groupEntitys = new ArrayList<org.activiti.engine.identity.Group>();
		
		for (Group bGroup : bGroups) {
			GroupEntity groupEntity = toActivitiGroup(bGroup);
			groupEntitys.add(groupEntity);
		}
		return groupEntitys;
	}
}

这样,自身的用户就可以充当activiti的用户了

修改后,activiti的相关ACT_ID_XXX表就可以删除了。

 

 参考

 

http://rongjih.blog.163.com/blog/static/335744612012631112640968/

http://forums.activiti.org/en/viewtopic.php?f=6&t=2439&hilit=UserManager

http://www.kafeitu.me/activiti/2012/04/23/synchronize-or-redesign-user-and-role-for-activiti.html

 

分享到:
评论
11 楼 awkejiang 2017-05-18  
zyg345646335 写道
你好,taskService.createTaskQuery().taskCandidateUser(userId)调用的时候还是会关联自带的用户组的表,怎么解决?


同样的问题,难道是还要覆写MembershipEntityManager?
10 楼 laovel 2016-12-30  
两个getSessionType方法的返回值写错了
应该是UserIdentityManager.class和GroupIdentityManager.class
9 楼 wz5891 2016-08-01  
Xujian0000abcd 写道
winner_king 写道
zyg345646335 写道
你好,taskService.createTaskQuery().taskCandidateUser(userId)调用的时候还是会关联自带的用户组的表,怎么解决?

你的这个问题解决吗?怎么解决的?


你的这个问题解决了吗,我也遇到同样的问题~



问题的关键在 类 ProcessEngineConfigurationImpl
第1032行

     addSessionFactory(new UserEntityManagerFactory());
      addSessionFactory(new GroupEntityManagerFactory());
      addSessionFactory(new MembershipEntityManagerFactory());
    }
   
    if (customSessionFactories!=null) {
      for (SessionFactory sessionFactory: customSessionFactories) {
        addSessionFactory(sessionFactory);
      }
    }


protected void addSessionFactory(SessionFactory sessionFactory) {
    sessionFactories.put(sessionFactory.getSessionType(), sessionFactory);
  }

再打开 UserEntityManagerFactory 和 GroupEntityManagerFactory 看看:

public class UserEntityManagerFactory implements SessionFactory {

  public Class< ? > getSessionType() {
    return UserIdentityManager.class;
  }

  public Session openSession() {
    return new UserEntityManager();
  }

}

public class GroupEntityManagerFactory implements SessionFactory {

  public Class< ? > getSessionType() {
    return GroupIdentityManager.class;
  }

  public Session openSession() {
    return new GroupEntityManager();
  }

}

所以,要覆盖默认的 UserEntityManagerFactory ,在 CustomUserEntityManagerFactory 的getSessionType 需要填写 UserIdentityManager。
相应的CustomGroupEntityManagerFactory 需要填写:GroupIdentityManager

如:
public class CustomUserEntityManagerSessionFactory implements SessionFactory {
@Autowired
private CustomUserEntityManager userEntityManager;


@Override
public Class<?> getSessionType() {
return UserIdentityManager.class;
}

@Override
public Session openSession() {
return userEntityManager;
}
}
8 楼 Xujian0000abcd 2015-03-12  
winner_king 写道
zyg345646335 写道
你好,taskService.createTaskQuery().taskCandidateUser(userId)调用的时候还是会关联自带的用户组的表,怎么解决?

你的这个问题解决吗?怎么解决的?


你的这个问题解决了吗,我也遇到同样的问题~
7 楼 winner_king 2014-08-18  
zyg345646335 写道
你好,taskService.createTaskQuery().taskCandidateUser(userId)调用的时候还是会关联自带的用户组的表,怎么解决?

你的这个问题解决吗?怎么解决的?
6 楼 zyg345646335 2014-03-26  
你好,taskService.createTaskQuery().taskCandidateUser(userId)调用的时候还是会关联自带的用户组的表,怎么解决?
5 楼 jspvsjsj 2014-03-05  
UsersFormType是干什么用的
4 楼 lihao312 2013-11-22  
能给完整实例不? 我这样配置了, identityService.createUserQuery().userId(userid).singleResult()
但是始终是空的?
3 楼 美味人间 2013-07-24  
344724999 写道
大侠 能把AccountManager 类贴下吗?

AccountManager 只是一个service,用来获取用户或者用户组而已,它就调用了DAO从数据库查询出对象,部分代码如下
	
public class AccountManager extends BaseService<User,UserDao>{

	private UserDao userDao;
	private GroupDao groupDao;
	private ShiroDbRealm shiroRealm;

	public Group getGroupByGroupId(String groupId) {
		return groupDao.findByGroupId(groupId);
	}

	//-- User Manager --//
	public User getUser(Long id) {
		return userDao.findOne(id);
	}
}
2 楼 344724999 2013-07-23  
大侠 能把AccountManager 类贴下吗?
1 楼 古叶斋 2013-06-19  
AccountManager呢?

相关推荐

    activiti6.0实现流程图片自定义颜色 当前任务为红色,走过的任务为绿色,自定义文字颜色连线文字显示

    5. 显示流程图:最后,将生成的自定义颜色流程图展示给用户,使他们能清楚地看到流程的当前状态。 通过以上步骤,我们可以为用户提供更加直观和易于理解的流程图,提高工作效率。在实际开发中,还需要考虑性能优化...

    Activiti 5_13 用户手册

    - 自定义行为:如何编写自定义的用户任务行为、服务任务行为等,扩展Activiti的功能。 - 事件处理器:了解如何实现自定义事件处理器,处理特定的业务逻辑。 12. **最佳实践与案例分析** - 实战指导:提供实际...

    activiti将用户输入框修改为弹出选择框

    这里我们主要讨论阿尔法表单,因为它们更适合自定义用户界面。 要将用户输入框改造成弹出选择框,你需要遵循以下步骤: 1. **设计流程定义**:在流程定义中,你需要为用户任务指定一个表单键(formKey)。这个键...

    Spring-activiti-ruoyi-activiti

    Spring-Activiti是Spring社区对Activiti工作流引擎的一个集成和封装,它将 Activiti 的强大功能与 Spring 框架的易用性相结合,使得在Java环境中部署和管理工作流变得简单。Activiti 提供了一套完整的流程定义语言...

    Activiti V5.21 用户手册 中文版

    5. **任务管理**:讲解 Activiti 中的任务概念,包括任务分配、完成任务、任务查询等功能,以及如何使用 TaskService API 进行任务操作。 6. **表单与数据**:介绍如何集成表单以收集和展示流程中的数据,以及如何...

    Activiti_5.8_用户指南中文版

    5. **事件与监听器**:Activiti 提供了事件机制,如任务完成、流程实例启动或结束等,可以定义监听器来响应这些事件,实现自定义的行为。 6. **表单与字段绑定**:Activiti 集成了表单引擎,允许用户自定义表单并与...

    Activiti 5.13 用户手册(中文版)

    综上所述,Activiti 5.13 用户手册将详细介绍这些概念和使用方法,帮助开发者和业务分析师充分利用 Activiti 实现高效、灵活的业务流程管理。通过深入学习和实践,您可以更好地理解和应用这一强大的工作流引擎。

    Activiti 5.14 中文用户手册

    Activiti Explorer则是一个Web应用程序,可以管理流程实例和报表,并且支持数据库的修改。 Activiti Modeler是一个流程模型编辑器,它允许开发者导入、编辑和报告流程模型。最后,REST API部分涵盖了如何通过通用的...

    activiti6用户手册 英文

    11. **安全性与权限**:手册也会涉及Activiti的安全机制,如用户、组、角色的管理,以及如何设置权限和访问控制。 12. **最佳实践与案例研究**:最后,手册可能包含一些最佳实践建议和实际应用场景,帮助用户更好地...

    activiti将用户输入框修改为弹出选择框和中文编辑器

    你可能需要编写自定义的JavaScript代码来处理表单提交,确保用户在中文编辑器中输入的内容能正确地传递给Activiti引擎。 在`activiti将用户输入框修改为弹出选择框.zip`这个压缩包中,可能包含了上述修改的源代码和...

    activiti-选择代理人候选人候选组.rar

    通过自定义接口,它可以适应各种用户管理和身份验证系统,而选择式的参与者输入则使得流程设计更为直观和高效。对于需要频繁调整或有大量用户的Activiti流程,这是一个非常实用的增强工具。为了使用这个扩展,只需要...

    Activiti 5.4用户指南(中文)

    Activiti 5.4 采用了 Apache 2.0 许可,这意味着它是免费且开源的,用户可以自由地使用、修改和分发源代码,为企业提供了灵活的使用选择。 2. **下载与获取** 用户可以通过官方网站或者其他开源软件仓库下载 ...

    Activiti 5.13 用户指南(中文版)

    这部分将介绍如何通过Activiti Explorer进行流程图的展示、流程实例的管理和报表的修改。 ### 13. Activiti Modeler Activiti Modeler是一个基于浏览器的流程模型编辑工具,允许用户导入、报告数据、编辑模型并将其...

    Activiti5.4 用户指南(中文版)

    总之,"Activiti5.4 用户指南(中文版)"是一个全面的学习资源,它涵盖了从入门到进阶的各个层面,无论你是Java开发者还是流程管理新手,都能从中受益匪浅。通过阅读并实践这份指南,你将能够熟练掌握 Activiti 5.4...

    activiti 5.16 流程管理 中文版

    ### Activiti 5.16 流程管理中文版知识点概览 #### 1. 简介 - **协议**:Activiti采用Apache License 2.0协议。 - **下载**:可以从官方网站或第三方镜像站点下载Activiti 5.16版本。 - **源码**:GitHub上提供了...

    activiti5视频-7.流程跟踪.rar

    5. **流程实例调试**:对于开发和测试阶段,Activiti 还提供了流程实例的调试功能,允许开发者暂停流程执行,检查当前状态,并进行必要的修改。这在优化和调试复杂流程时非常有用,视频可能会演示这一过程。 6. **...

    activiti 5.18用户手册中文翻译Markdown文件

    在这个用户手册中,你可以深入理解Activiti的核心概念、功能以及如何有效地使用它来设计和管理业务流程。 1. **核心概念**: - **流程定义(Process Definition)**:这是业务流程的蓝图,用BPMN 2.0语言编写,...

    Activiti_5.13_中文用户手册

    ### Activiti 5.13 中文用户手册关键知识点概览 #### 一、环境配置与依赖 **标题概述:** Activiti 5.13 中文用户手册提供了详细的环境配置指南。 **描述详情:** 为了确保Activiti 5.13能够正常运行,手册推荐...

    Activiti V5.21 用户手册 中文版_Activiti5.21介绍_activiti5.21_ActivitiV5.1

    "Activiti V5.21 用户手册 中文版"是专门为V5.21版本编写的,详尽介绍了如何安装、配置、开发和管理Activiti系统,包括实例教程、API参考和常见问题解答,是学习和使用Activiti的重要参考资料。 7. **升级与兼容性...

    activiti5.9的编辑组件activiti-modeler

    7. **自定义和扩展**:如何根据项目需求对Activiti Modeler进行定制,例如添加新的图形元素、修改交互行为或对接企业内部系统。 8. **实践应用**:提供实例,展示如何使用Activiti Modeler在实际项目中设计和优化...

Global site tag (gtag.js) - Google Analytics