`
美味人间
  • 浏览: 90525 次
  • 性别: 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呢?

相关推荐

    Activiti5用户指南(中文版)

    Activiti5用户指南(中文版) 第一章、简介 ....................................................................................................................................................................

    企业后台管理基础框架 hsweb.zip

    工作流管理: activiti工作流,在线配置流程,配合动态表单实现自定义流程.邮件代收: 代收指定邮箱的邮件框架功能全局restful json,前后分离.通用dao,service,controller类,增删改查直接继承即可.通用mybatis配置文件,...

    Java EE常用框架.xmind

    Activiti5是一个业务流程管理(BPM)框架 如果我们的业务是比较复杂的话,我们才会用到工作流! 使用Activiti的步骤 定义工作流 画一个BPMN图就可以了 部署工作流 执行工作流--&gt;按照我们...

    互联网创意产品众筹平台

    │ 4-用户管理模块-修改功能实现7 t7 n" U% B% m- | │ 5-用户管理模块-删除功能实现 │ 6-用户管理模块-批量删除功能实现 │ ├─众筹项目-第06天《Atcrowdfunding》; L8 k& Y* v9 \- M% t! ^. q │ ├─代码 , s....

    openidm-delegatedadmin:演示如何限制对管理用户数据子集的访问

    该项目样板旨在通过提供可重用的结构来管理这些自定义的整个开发生命周期,从而帮助集成商。 有了这个项目样板,集成商可以像对待任何其他源代码一样对待这些项目定制——在工作副本中进行跟踪,能够与他们的集成...

    java源码包JSP实例源码JAVA开发源码65个合集.zip

    业务流程管理(BPM)和工作流系统 Activiti.zip 中国移动业务管理系统源码(SSH框架).rar 书籍管理系统.rar 企业进销存管理系统.rar 传奇私服登录器Java版附源代码.rar 修改表头加密数据库.rar 分离SQL Server数据库....

    word源码java-hsweb:hsweb

    activiti工作流,在线配置流程,配合动态表单实现自定义流程. 邮件代收: 代收指定邮箱的邮件 框架功能 全局restful+json,前后分离. 通用dao,service,controller类,增删改查直接继承即可. 通用myba

    word源码java-axis-framework:轴框架

    activiti工作流,在线配置流程,配合动态表单实现自定义流程. 邮件代收: 代收指定邮箱的邮件 框架功能 全局restful+json,前后分离. 通用dao,service,controller类,增删改查直接继承即可. 通用mybatis配置文件,支

    openidm-elasticsearch:与 OpenIDM 一起使用 ElasticSearch 的环境

    该项目样板旨在通过提供可重用的结构来管理这些自定义的整个开发生命周期,从而帮助集成商。 有了这个项目样板,集成商可以像对待任何其他源代码一样对待这些项目定制——在工作副本中进行跟踪,能够与他们的集成...

    entfrm-boot可视化开发平台-其他

    用户管理:用户是系统操作者,该功能主要完成系统用户配置。菜单管理:配置系统菜单,操作权限,按钮权限标识等。字典管理:对系统中经常使用的一些较为固定的数据进行维护。参数管理:对系统动态配置常用参数。快捷...

    java开源包5

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包4

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包7

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    JAVA上百实例源码以及开源项目源代码

    发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器  Tcp服务端与客户端的JAVA实例源代码,一个简单...

    JAVA上百实例源码以及开源项目

    发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器  Tcp服务端与客户端的JAVA实例源代码,一个简单...

    java开源包1

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包11

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

Global site tag (gtag.js) - Google Analytics