[Java][activiti]同步或者重构activiti identify用户数据的方法(一)

2014-11-23 21:39:24 · 作者: · 浏览: 24

同步或者重构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,同时设置角色
  • *
* * @param user 用户对象 * @param orgId 部门ID * @param roleIds 角色ID集合 * @param synToActiviti 是否同步到Activiti数据库,通过配置文件方式设置,使用属性:account.user.add.syntoactiviti * @throws OrganizationNotFoundException 关联用户和部门的时候从数据库查询不到哦啊部门对象 * @throws Exception 其他未知异常 */ publicvoid save(User user, Long orgId, List roleIds, booleansynToActiviti) throws OrganizationNotFoundException, ServiceException, Exception; /** * 删除用户 * @param userId 用户ID * @param synToActiviti 是否同步到Activiti数据库,通过配置文件方式设置,使用属性:account.user.add.syntoactiviti * @throws Exception */ publicvoid delete(Long userId, booleansynToActiviti) throwsServiceException, Exception; /** * 同步用户、角色数据到工作流 * @throws Exception */ publicvoid synAllUserAndRoleToActiviti() throwsException; /** * 删除工作流引擎Activiti的用户、角色以及关系 * @throws Exception */ publicvoid deleteAllActivitiIdentifyData() throwsException; }


同步单个接口实现片段:

@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