Activityラーニング資料(Activity Identifyユーザーデータの同期または再構築)


Activity Identifyユーザーデータの同期または再構築に関する複数のシナリオの比較
ユーザーに関わるシステムごとにユーザー権限管理プラットフォームまたはモジュールがあり、ユーザーとシステム内の機能、データ権限を維持するために使用されていると信じています.私たちが使用しているActivityワークフローエンジンは、User、Groupを含むIdentifyモジュールを設計しています.いくつかの同期スキームを紹介し、最後に比較をまとめます.
          Activiti   Identify               ,     ~    

シナリオ1: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 errorMsg = "      :id=" + userId;
                logger.error(errorMsg);
                throw new RuntimeException(errorMsg);
            } else {
                newActivitiUser(user, roleIds);
            }
        }
 
    }
 
    /**
     *            
     * @param user          {@link User}
     * @param roleIds          ID  
     */
    private void newActivitiUser(User user, List<long> roleIds) {
        String userId = user.getId().toString();
 
        //     
        saveActivitiUser(user);
 
        //   membership
        addMembershipToIdentify(roleIds, userId);
    }
 
    /**
     *        Activiti {@link org.activiti.engine.identity.User}
     * @param user      , {@link User}
     */
    private void 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
     */
    private void addMembershipToIdentify(List<long> roleIds, String userId) {
        for (Long roleId : roleIds) {
            Role role = roleManager.getEntity(roleId);
            logger.debug("add role to activit: {}", role);
            identityService.createMembership(userId, role.getEnName());
        }
    }
 
    /**
     *            
     * @param user              {@link User}
     * @param roleIds              ID  
     * @param activitiUser  Activiti       ,{@link org.activiti.engine.identity.User}
     */
    private void updateActivitiData(User user, List<long> roleIds, org.activiti.engine.identity.User activitiUser) {
 
        String userId = user.getId().toString();
 
        //         
        cloneAndSaveActivitiUser(user, activitiUser);
 
        //      membership
        List<group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();
        for (Group group : activitiGroups) {
            logger.debug("delete group from activit: {}", ToStringBuilder.reflectionToString(group));
            identityService.deleteMembership(userId, group.getId());
        }
 
        //   membership
        addMembershipToIdentify(roleIds, userId);
    }
 
    /**
     *              Activiti User   
     * @param user                
     * @param activitiUser  Activiti User
     */
    private void cloneAndSaveActivitiUser(User user, org.activiti.engine.identity.User activitiUser) {
        activitiUser.setFirstName(user.getName());
        activitiUser.setLastName(StringUtils.EMPTY);
        activitiUser.setPassword(StringUtils.EMPTY);
        activitiUser.setEmail(user.getEmail());
        identityService.saveUser(activitiUser);
    }
 
    @Override
    public void delete(Long userId, boolean synToActiviti, boolean synToChecking) throws ServiceException, Exception {
        //            
        User user = accountManager.getEntity(userId);
        if (user == null) {
            throw new ServiceException("     ,   ID " + userId + "   ");
        }
 
        /**
         *     Activiti User Group
         */
        if (synToActiviti) {
            //     Activiti User
            List<role> roleList = user.getRoleList();
            for (Role role : roleList) {
                identityService.deleteMembership(userId.toString(), role.getEnName());
            }
 
            //     Activiti User
            identityService.deleteUser(userId.toString());
        }
 
        //        
        accountManager.deleteUser(userId);
 
        //        
        if (synToChecking) {
            checkingAccountManager.deleteEntity(userId);
        }
    }
}
</role></group></long></long></long></org.activiti.engine.identity.user></long>

?
すべてのデータインタフェース実装フラグメントを同期するには、次の手順に従います.
すべてのデータを同期するには、次の手順に従います.
  • ActivityのUser、Group、Membershipデータ
  • を削除する
  • RoleオブジェクトデータをGroup
  • にコピー
  • ユーザーデータおよびメンバーシップデータのコピー
  • ActivitiIdentifyCommonDao.java
    public class ActivitiIdentifyCommonDao {
     
        protected Logger logger = LoggerFactory.getLogger(getClass());
         
        @Autowired
        private JdbcTemplate jdbcTemplate;
     
        /**
         *          
         */
        public void deleteAllUser() {
            String sql = "delete from ACT_ID_USER";
            jdbcTemplate.execute(sql);
            logger.debug("deleted from activiti user.");
        }
     
        /**
         *          
         */
        public void deleteAllRole() {
            String sql = "delete from ACT_ID_GROUP";
            jdbcTemplate.execute(sql);
            logger.debug("deleted from activiti group.");
        }
     
        /**
         *          
         */
        public void deleteAllMemerShip() {
            String sql = "delete from ACT_ID_MEMBERSHIP";
            jdbcTemplate.execute(sql);
            logger.debug("deleted from activiti membership.");
        }
     
    }

    ?
    ActivitiIdentifyService.java
    public class ActivitiIdentifyService extends AbstractBaseService {
         
        @Autowired
        protected ActivitiIdentifyCommonDao activitiIdentifyCommonDao;
         
        /**
         *          
         */
        public void deleteAllUser() {
            activitiIdentifyCommonDao.deleteAllUser();
        }
         
        /**
         *          
         */
        public void deleteAllRole() {
            activitiIdentifyCommonDao.deleteAllRole();
        }
         
        /**
         *          
         */
        public void deleteAllMemerShip() {
            activitiIdentifyCommonDao.deleteAllMemerShip();
        }
    }

    ?
    AccountServiceImpl.java
    public class AccountServiceImpl implements AccountService {
    @Override
        public void synAllUserAndRoleToActiviti() throws Exception {
     
            //        、      
            deleteAllActivitiIdentifyData();
     
            //       
            synRoleToActiviti();
     
            //           
            synUserWithRoleToActiviti();
        }
     
        /**
         *           
         */
        private void synUserWithRoleToActiviti() {
            List<user> allUser = accountManager.getAll();
            for (User user : allUser) {
                String userId = user.getId().toString();
     
                //        Activiti
                saveActivitiUser(user);
     
                //         
                List<role> roleList = user.getRoleList();
                for (Role role : roleList) {
                    identityService.createMembership(userId, role.getEnName());
                    logger.debug("add membership {user: {}, role: {}}", userId, role.getEnName());
                }
            }
        }
     
        /**
         *          {@link Group}
         */
        private void synRoleToActiviti() {
            List<role> allRole = roleManager.getAll();
            for (Role role : allRole) {
                String groupId = role.getEnName().toString();
                Group group = identityService.newGroup(groupId);
                group.setName(role.getName());
                group.setType(role.getType());
                identityService.saveGroup(group);
            }
        }
     
        @Override
        public void deleteAllActivitiIdentifyData() throws Exception {
            activitiIdentifyService.deleteAllMemerShip();
            activitiIdentifyService.deleteAllRole();
            activitiIdentifyService.deleteAllUser();
        }
    }

    ?
    シナリオ2:IdentifyServiceインタフェースを上書きする実装
    このメソッドはIdentifyServiceインタフェースのデフォルト実装クラスを上書きします:org.activiti.engine.impl.IdentityServiceImpl.
    読者は、既存のユーザ管理インタフェースに基づいてIdentityServiceImplを上書きする各メソッドのデフォルト実装を実現することができ、これは、一連のテーブルの使用を放棄することに等しい:ACT_ID_.
    このメソッドではコードは提供されません.既存のインタフェースに基づいて、インタフェース定義の機能を読者自身で実装してください.
    シナリオ3:同名のACTをビューで上書きするID_シリーズ表
    このシナリオは第2のシナリオと同様であり、シリーズ表の使用を放棄する:ACT_ID_;しかし、やり方が正規ではなく、ソースコードを変更し、同名のビューを作成する必要があります.
    1.作成したACTを削除するID_*表
    ビューを作成するには、エンジンが自動的に作成したACTを削除する必要があります.ID_*テーブル、それ以外の場合はビューを作成できません.
    2.ビューの作成:
  • ACT_ID_GROUP
  • ACT_ID_INFO
  • ACT_ID_MEMBERSHIP
  • ACT_ID_USER

  • 作成したビューは、ユーザのACT_などのデータ型が一致することを保証する.ID_MEMBERSHIPテーブルの2つのフィールドはいずれも文字型であり、一般的にシステムではNUMBERをユーザー・ロールのプライマリ・キー・タイプとして使用しているため、ビューを作成する際に数字のタイプを文字型に変換する.
    3.エンジンのデフォルト構成の変更
    筆者は表構造に従って上記のいくつかの同名のビューを作成したが、Activityは自己保護メカニズムを持ち、エンジンが初期化できないため、ソースコードを変更しなければ正常に使用できない.
    変更org.activiti.engine.impl.cfg.ProcessEngineConfigurationImplのisDbIdentityUsed=false
      ,                        isDbIdentityUsed=false。
    

    まとめ
  • 方案一:ソースコードを破壊しない、修正しない、インタフェース向けにプログラミングし、推薦する.
  • 案2:既存のIdentifyモジュールを放棄し、カスタム実装を使用し、特殊な場合はこの方式を使用することができる.
  • 案3:一部のソースコードを破壊し、既存のユーザーデータテーブルに基づいて作成とACT_ID_*同じ名前のビューでいいです.もう一つの欠点は、IdentifyServiceを使用してUser、Group、履歴書の両方の関係を追加できないことです.もちろん、Activityからメンテナンスする必要はありません.