同步或者重构Activiti Identify用户数据的多种方案比较
相信每个涉及到用户的系统都有一套用户权限管理平台或者模块,用来维护用户以及在系统内的功能、数据权限,我们使用的Activiti工作流引擎配套设计了包括User、Group的Identify模块,怎么和业务数据同步呢,这个问题是每个新人必问的问题之一,下面介绍几种同步方案,最后总结比较。
如果你在考虑直接使用Activiti引擎的Identify模块作为系统的用户数据管理模块,您真是奇才~开个玩笑
方案一:调用IdentifyService接口完成同步
参考IdentifyService接口Javadoc:http://www.activiti.org/javadocs/org/activiti/engine/IdentityService.html
接口定义:
package com.foo.arch.service.id;
import java.util.List;
import com.foo.arch.entity.id.User;
import com.foo.arch.service.ServiceException;
/**
* 维护用户、角色、权限接口
*
* @author HenryYan
*
*/
public interface AccountService {
/**
* 添加用户并[同步其他数据库]
* <ul>
* <li>step 1: 保存系统用户,同时设置和部门的关系</li>
* <li>step 2: 同步用户信息到activiti的identity.User,同时设置角色</li>
* </ul>
*
* @param user 用户对象
* @param orgId 部门ID
* @param roleIds 角色ID集合
* @param synToActiviti 是否同步到Activiti数据库,通过配置文件方式设置,使用属性:account.user.add.syntoactiviti
* @throws OrganizationNotFoundException 关联用户和部门的时候从数据库查询不到哦啊部门对象
* @throws Exception 其他未知异常
*/
public void save(User user, Long orgId, List<long> roleIds, boolean synToActiviti)
throws OrganizationNotFoundException, ServiceException, Exception;
/**
* 删除用户
* @param userId 用户ID
* @param synToActiviti 是否同步到Activiti数据库,通过配置文件方式设置,使用属性:account.user.add.syntoactiviti
* @throws Exception
*/
public void delete(Long userId, boolean synToActiviti) throws ServiceException, Exception;
/**
* 同步用户、角色数据到工作流
* @throws Exception
*/
public void synAllUserAndRoleToActiviti() throws Exception;
/**
* 删除工作流引擎Activiti的用户、角色以及关系
* @throws Exception
*/
public void deleteAllActivitiIdentifyData() throws Exception;
}
同步单个接口实现片段:
@Service
@Transactional
public class AccountServiceImpl implements AccountService {
/**
* 保存用户信息,并且同步用户信息到activiti的identity.User和identify.Group
* @param user 用户对象{@link User}
* @param roleIds 用户拥有的角色ID集合
* @param synToActiviti 是否同步数据到Activiti
* @see Role
*/
public void saveUser(User user, List<long> roleIds, boolean synToActiviti) {
String userId = ObjectUtils.toString(user.getId());
// 保存系统用户
accountManager.saveEntity(user);
// 同步数据到Activiti Identify模块
if (synToActiviti) {
UserQuery userQuery = identityService.createUserQuery();
List<org.activiti.engine.identity.user> activitiUsers = userQuery.userId(userId).list();
if (activitiUsers.size() == 1) {
updateActivitiData(user, roleIds, activitiUsers.get(0));
} else if (activitiUsers.size() > 1) {
String err