读书人

Activiti 五 自定义用户管理 修改

发布时间: 2013-03-21 10:08:17 作者: rapoo

Activiti 5 自定义用户管理 修改
<!-- Activiti begin --><bean id="processEngineConfiguration" 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 /></list></property><property name="customSessionFactories"><list> <bean /> <bean /></list> </property></bean>

?其中增加了customSessionFactories的配置。

?

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

public class CustomGroupEntityManagerFactory implements SessionFactory {private GroupEntityManager groupEntityManager;@Autowiredpublic 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;@Autowiredpublic 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 *  */@Servicepublic class CustomUserEntityManager extends UserEntityManager {private static final Log logger = LogFactory.getLog(CustomUserEntityManager.class);@Autowiredprivate AccountManager accountManager;@Overridepublic 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;}}@Overridepublic 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;}@Overridepublic List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {throw new RuntimeException("not implement method.");}@Overridepublic IdentityInfoEntity findUserInfoByUserIdAndKey(String userId,String key) {throw new RuntimeException("not implement method.");}@Overridepublic List<String> findUserInfoKeysByUserIdAndType(String userId,String type) {throw new RuntimeException("not implement method.");}@Overridepublic 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;@Servicepublic class CustomGroupEntityManager extends GroupEntityManager {private static final Log logger = LogFactory.getLog(CustomGroupEntityManager.class);@Autowiredprivate AccountManager accountManager;@Overridepublic 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;}}@Overridepublic 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;}@Overridepublic List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {throw new RuntimeException("not implement method.");}@Overridepublic 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

?

读书人网 >软件架构设计

热点推荐