相信每个涉及到用户的系统都有一套用户权限管理平台或者模块,用来维护用户以及在系统内的功能、数据权限,我们使用的Activiti工作流引擎配套设计了包括 User、Group 的Identify模块,怎么和业务数据同步呢,这个问题是每个新人必问的问题之一,下面介绍几种同步方案,最后总结比较。
参考IdentifyService接口Javadoc: http://www.activiti.org/javadocs/org/activiti/engine/IdentityService.html
同步全部数据步骤:
删除Activiti的User、Group、Membership数据
复制Role对象数据到Group
复制用户数据以及Membership数据
publicclass ActivitiIdentifyService extendsAbstractBaseService {
@Autowired
protectedActivitiIdentifyCommonDao activitiIdentifyCommonDao;
/**
* 删除用户和组的关系
*/
publicvoid deleteAllUser() {
activitiIdentifyCommonDao.deleteAllUser();
}
/**
* 删除用户和组的关系
*/
publicvoid deleteAllRole() {
activitiIdentifyCommonDao.deleteAllRole();
}
/**
* 删除用户和组的关系
*/
publicvoid deleteAllMemerShip() {
activitiIdentifyCommonDao.deleteAllMemerShip();
}
}
publicclass AccountServiceImpl implementsAccountService {
@Override
publicvoid synAllUserAndRoleToActiviti() throwsException {
// 清空工作流用户、角色以及关系
deleteAllActivitiIdentifyData();
// 复制角色数据
synRoleToActiviti();
// 复制用户以及关系数据
synUserWithRoleToActiviti();
}
/**
* 复制用户以及关系数据
*/
privatevoid 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}
*/
privatevoid 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
publicvoid deleteAllActivitiIdentifyData() throwsException {
activitiIdentifyService.deleteAllMemerShip();
activitiIdentifyService.deleteAllRole();
activitiIdentifyService.deleteAllUser();
}
}
此方法覆盖 IdentifyService 接口的默认实现类: org.activiti.engine.impl.IdentityServiceImpl 。
读者可以根据现有的用户管理接口实现覆盖 IdentityServiceImpl 的每个方法的默认实现,这样就等于放弃使用系列表:ACT_ID_。
此方法不再提供代码,请读者自行根据现有接口逐一实现接口定义的功能。
此方案和第二种类似,放弃使用系列表:ACT_ID_,创建同名的视图。
创建视图必须删除引擎自动创建的ACT_ID_*表,否则不能创建视图。
创建的视图要保证数据类型一致,例如用户的ACT_ID_MEMBERSHIP表的两个字段都是字符型,一般系统中都是用NUMBER作为用户、角色的主键类型,所以创建视图的时候要把数字类型转换为字符型。
在引擎配置中设置属性 dbIdentityUsed 为 false 即可。
<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
...
<propertyname="dbIdentityUsed"ref="false">
...
</property></bean>
方案 一 :不破坏、不修改源码, 面向接口编程 , 推荐 ;
方案 二 :放弃原有的Identify模块,使用自定义的实现,特殊情况可以使用此方式;
方案 三 :不需要编写 Java 代码,只需要创建同名视图即可 , 对于现有系统的集成、强烈 推荐 ;
凌云 2018-12-07
凌云 2018-12-07
凌云 2018-12-06
凌云 2018-12-07
泡泡 2016-05-12
白诗秀儿 2016-08-01
凌云 2019-03-14
三奇 2023-05-18
悠悠长风 2021-02-19
风的方向 2024-10-10
藏家569 2025-03-28
藏家838 2025-03-29
奇美拉 2025-03-29
许老头 2025-03-28
藏家942 2025-03-28
mei 2025-03-28
藏家113 2025-03-28
藏家518 2025-03-28
藏家372 2025-03-28
藏家372 2025-03-28