tion {
// 清空工作流用户、角色以及关系
deleteAllActivitiIdentifyData();
// 复制角色数据
synRoleToActiviti();
// 复制用户以及关系数据
synUserWithRoleToActiviti();
}
/**
* 复制用户以及关系数据
*/
privatevoid synUserWithRoleToActiviti() {
List
allUser = accountManager.getAll();
for(User user : allUser) {
String userId = user.getId().toString();
// 添加一个用户到Activiti
saveActivitiUser(user);
// 角色和用户的关系
List
roleList = user.getRoleList(); for(Role role : roleList) { identityService.createMembership(userId, role.getEnName()); logger.debug(add membership {user: {}, role: {}}, userId, role.getEnName()); } } } /** * 同步所有角色数据到{@link Group} */ privatevoid synRoleToActiviti() { List
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 publicvoid deleteAllActivitiIdentifyData() throwsException { activitiIdentifyService.deleteAllMemerShip(); activitiIdentifyService.deleteAllRole(); activitiIdentifyService.deleteAllUser(); } }
方案二:覆盖IdentifyService接口的实现
此方法覆盖IdentifyService接口的默认实现类:org.activiti.engine.impl.IdentityServiceImpl。
读者可以根据现有的用户管理接口实现覆盖IdentityServiceImpl的每个方法的默认实现,这样就等于放弃使用系列表:ACT_ID_。
此方法不再提供代码,请读者自行根据现有接口逐一实现接口定义的功能。
方案三:用视图覆盖同名的ACT_ID_系列表
此方案和第二种类似,放弃使用系列表:ACT_ID_,创建同名的视图。
1.删除已创建的ACT_ID_*表
创建视图必须删除引擎自动创建的ACT_ID_*表,否则不能创建视图。
2.创建视图:
ACT_ID_GROUPACT_ID_INFOACT_ID_MEMBERSHIPACT_ID_USER
创建的视图要保证数据类型一致,例如用户的ACT_ID_MEMBERSHIP表的两个字段都是字符型,一般系统中都是用NUMBER作为用户、角色的主键类型,所以创建视图的时候要把数字类型转换为字符型。
3.修改引擎默认配置
在引擎配置中设置属性dbIdentityUsed为false即可。
...
...
总结
方案一:不破坏、不修改源码,面向接口编程,推荐;
方案二:放弃原有的Identify模块,使用自定义的实现,特殊情况可以使用此方式;
方案三:不需要编写Java代码,只需要创建同名视图即可,对于现有系统的集成、强烈推荐;