同步或者重构Activiti Identify用户数据的多种方案比较
相信每个涉及到用户的系统都有一套用户权限管理平台或者模块,用来维护用户以及在系统内的功能、数据权限,我们使用的Activiti工作流引擎配套设计了包括User、Group的Identify模块,怎么和业务数据同步呢,这个问题是每个新人必问的问题之一,下面介绍几种同步方案,最后总结比较。
如果你在考虑直接使用Activiti引擎的Identify模块作为系统的用户数据管理模块,您真是奇才~开个玩笑
方案一:调用IdentifyService接口完成同步
importjava.util.List;
importcom.foo.arch.entity.id.User;
importcom.foo.arch.service.ServiceException;
/**
* 维护用户、角色、权限接口
*
* @author HenryYan
*
*/
publicinterface AccountService {
/**
* 添加用户并[同步其他数据库]
*
- *
- step 1: 保存系统用户,同时设置和部门的关系
- *
- step 2: 同步用户信息到activiti的identity.User,同时设置角色
- *
同步单个接口实现片段:
@Service
@Transactional
publicclass AccountServiceImpl implementsAccountService {
/**
* 保存用户信息,并且同步用户信息到activiti的identity.User和identify.Group
* @param user 用户对象{@link User}
* @param roleIds 用户拥有的角色ID集合
* @param synToActiviti 是否同步数据到Activiti
* @see Role
*/
publicvoid saveUser(User user, List
roleIds, booleansynToActiviti) {
String userId = ObjectUtils.toString(user.getId());
// 保存系统用户
accountManager.saveEntity(user);
// 同步数据到Activiti Identify模块
if(synToActiviti) {
UserQuery userQuery = identityService.createUserQuery();
List
activitiUsers = userQuery.userId(userId).list(); if(activitiUsers.size() == 1) { updateActivitiData(user, roleIds, activitiUsers.get(0)); }elseif (activitiUsers.size() > 1) { String errorMsg = 发现重复用户:id=+ userId; logger.error(errorMsg); thrownew RuntimeException(errorMsg); }else{ newActivitiUser(user, roleIds); } } } /** * 添加工作流用户以及角色 * @param user 用户对象{@link User} * @param roleIds 用户拥有的角色ID集合 */ privatevoid newActivitiUser(User user, List
roleIds) { String userId = user.getId().toString(); // 添加用户 saveActivitiUser(user); // 添加membership addMembershipToIdentify(roleIds, userId); } /** * 添加一个用户到Activiti {@link org.activiti.engine.identity.User} * @param user 用户对象, {@link User} */ privatevoid saveActivitiUser(User user) { String userId = user.getId().toString(); org.activiti.engine.identity.User activitiUser = identityService.newUser(userId); cloneAndSaveActivitiUser(user, activitiUser); logger.debug(add activiti user: {}, ToStringBuilder.reflectionToString(activitiUser)); } /** * 添加Activiti Identify的用户于组关系 * @param roleIds 角色ID集合 * @param userId 用户ID */ privatevoid addMembershipToIdentify(List
roleIds, String userId) { for(Long roleId : roleIds) { Role role = roleManager.getEntity(roleId); logger.debug(add role to activit: {}, role); identityService.createMembership(userId, role.g