Activityラーニング資料(Activity Identifyユーザーデータの同期または再構築)
Activity Identifyユーザーデータの同期または再構築に関する複数のシナリオの比較
ユーザーに関わるシステムごとにユーザー権限管理プラットフォームまたはモジュールがあり、ユーザーとシステム内の機能、データ権限を維持するために使用されていると信じています.私たちが使用しているActivityワークフローエンジンは、User、Groupを含むIdentifyモジュールを設計しています.いくつかの同期スキームを紹介し、最後に比較をまとめます.
シナリオ1:IdentifyServiceインタフェースを呼び出して同期を完了する
参考IdentifyServiceインタフェースJavadoc:http://www.activiti.org/javadocs/org/activiti/engine/IdentityService.html
インタフェースの定義:
?
単一のインタフェース実装フラグメントを同期するには、次の手順に従います.
?
すべてのデータインタフェース実装フラグメントを同期するには、次の手順に従います.
すべてのデータを同期するには、次の手順に従います. ActivityのUser、Group、Membershipデータ を削除する RoleオブジェクトデータをGroup にコピーユーザーデータおよびメンバーシップデータのコピー ActivitiIdentifyCommonDao.java
?
ActivitiIdentifyService.java
?
AccountServiceImpl.java
?
シナリオ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
まとめ方案一:ソースコードを破壊しない、修正しない、インタフェース向けにプログラミングし、推薦する. 案2:既存のIdentifyモジュールを放棄し、カスタム実装を使用し、特殊な場合はこの方式を使用することができる. 案3:一部のソースコードを破壊し、既存のユーザーデータテーブルに基づいて作成とACT_ID_*同じ名前のビューでいいです.もう一つの欠点は、IdentifyServiceを使用してUser、Group、履歴書の両方の関係を追加できないことです.もちろん、Activityからメンテナンスする必要はありません.
ユーザーに関わるシステムごとにユーザー権限管理プラットフォームまたはモジュールがあり、ユーザーとシステム内の機能、データ権限を維持するために使用されていると信じています.私たちが使用している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>
?
すべてのデータインタフェース実装フラグメントを同期するには、次の手順に従います.
すべてのデータを同期するには、次の手順に従います.
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_MEMBERSHIPテーブルの2つのフィールドはいずれも文字型であり、一般的にシステムではNUMBERをユーザー・ロールのプライマリ・キー・タイプとして使用しているため、ビューを作成する際に数字のタイプを文字型に変換する.
3.エンジンのデフォルト構成の変更
筆者は表構造に従って上記のいくつかの同名のビューを作成したが、Activityは自己保護メカニズムを持ち、エンジンが初期化できないため、ソースコードを変更しなければ正常に使用できない.
変更org.activiti.engine.impl.cfg.ProcessEngineConfigurationImplのisDbIdentityUsed=false
, isDbIdentityUsed=false。
まとめ