在很多项目中都不会使用activiti提供的用户信息表,因为一般公司都会有独立的用户系统,所以重构activiti的用户表是十分棘手且重要的事情。activiti中用户表是已act_id_*开头的四张表,分别是用户信息表、分组(角色)表、用户角色关联表、用户扩展信息表。具体数据表字段这里不展开叙述,大家有需要可以去网上查阅,接下来阐述怎么弃用activiti流程引擎中自带的4张用户表,构建自己的用户表。在重构的时候着实费了一番功夫,记录下来以备以后翻阅,也为大家提供一个参考。
1.POM文件依赖引入
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-data-jpa
org.activiti
activiti-spring-boot-starter-basic
5.22.0
org.apache.shiro
shiro-spring
1.4.0
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
org.mybatis.generator
mybatis-generator-core
1.3.1
mysql
mysql-connector-java
runtime
com.alibaba
fastjson
1.2.15
org.codehaus.jackson
jackson-mapper-asl
1.9.13
2.配置文件
server.port=8080
#数据库配置
spring.datasource.url = jdbc:mysql://localhost:3306/roc_process?characterEncoding=utf8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#关闭activiti自动部署扫描
spring.activiti.check-process-definitions=false
#上传文件大小配置
spring.servlet.multipart.max-file-size=5MB
#请求最大限制
spring.servlet.multipart.max-request-size=20MB
##指向mapper的xml文件位置
mybatis.mapper-locations=classpath:mapper/*.xml
3.自定义session工厂
重点来了:
Activiti的每一张表都有一个对应的实体管理器,在引擎初始化时会初始化所有表的实体管理器(提供CRUD等功能),每一个实体类都有一个对应的实体管理类及实体管理工厂类。实体管理工厂类实现SeesionFactory接口。
开始前先看一下我项目中的用户数据表字段。
用户信息表:
//用户编号
private String id;
//用户昵称,用于在界面显示
private String nickname;
//用户名
private String username;
//密码
private String password;
//加密盐值
private String salt;
//状态信息
private Integer status;
角色表
private String id;
//角色名称
private String role;
//描述
private String description;
//是否可用
private Integer enable;
//权限信息
private String permissions;
用户、角色关联表
private Integer id;
//用户id
private String userId;
//角色id
private String roleId;
其他数据表这里不做展示,关键的就是这三张表。
1).编写User的实体管理类
/**
* 自定义用户管理类,管理用户方法
* 添加其他方法
*/
@Component
public class CustomUserEntityManager extends UserEntityManager{
@Autowired
private RocIdUserMapper rocIdUserMapper;
@Autowired
private RocIdRoleMapper rocIdRoleMapper;
@Autowired
private RocIdUserRoleMapper rocIdUserRoleMapper;
@Override
public User findUserById(String userId){
User userEntity=new UserEntity();
RocIdUser rocIdUser=rocIdUserMapper.selectByPrimaryKey(userId);
//将自定义的user转化为activiti的类
userEntity=ActivitiUserUtils.toActivitiUser(rocIdUser);
//返回activiti的实体类
return userEntity;
}
@Override
public List findGroupsByUser(final String userId) {
if(userId==null){
return null;
}
List roleList=new ArrayList();
List userRoleList=rocIdUserRoleMapper.selectByUserId(userId);
for (RocIdUserRole userrole:userRoleList
) {
String roleId=userrole.getRoleId();
RocIdRole role=rocIdRoleMapper.selectByPrimaryKey(roleId);
roleList.add(role);
}
List gs=null;
gs=ActivitiUserUtils.toActivitiGroups(roleList);
return gs;
}
}
2).编写Group的实体管理类
/**
* 自定义角色管理
* 具体方法进入GroupEntityManager中查看
*/
@Component
public class CustomGroupEntityManager extends GroupEntityManager{
@Autowired
private RocIdUserMapper rocIdUserMapper;
@Autowired
private RocIdUserRoleMapper rocIdUserRoleMapper;
@Autowired
private RocIdRoleMapper rocIdRoleMapper;
@Override
public Group createNewGroup(String groupId) {
return super.createNewGroup(groupId);
}
/**
* 查找角色
* @param userId
* @return
*/
@Override
public List findGroupsByUser(final String userId) {
if(userId==null){
return null;
}
System.out.println("userId:"+userId);
RocIdUser rocIdUser=rocIdUserMapper.selectByUserName(userId);
List userRoleList=rocIdUserRoleMapper.selectByUserId(rocIdUser.getId());
System.out.println("userRoleList size:"+userRoleList.size());
List gs=new ArrayList();
GroupEntity groupEntity;
String roleId;
String activitiRole;
for (RocIdUserRole userRole:userRoleList
) {
groupEntity=new GroupEntity();
groupEntity.setRevision(1);
groupEntity.setType("assignment");
roleId=userRole.getRoleId();
RocIdRole role=rocIdRoleMapper.selectByPrimaryKey(roleId);
groupEntity.setId(role.getRole());
groupEntity.setName(role.getRole());
gs.add(groupEntity);
}
return gs;
}
}
3).编写User的管理工厂类
/**
* 自定义user的管理工厂类
*/
@Service
public class CustomUserEntityManagerFactory implements SessionFactory{
@Resource
private CustomUserEntityManager customUserEntityManager;
@Override
public Class> getSessionType() {
//此处也必须为activiti原生类
return UserIdentityManager.class;
}
@Override
public Session openSession() {
return customUserEntityManager;
}
@Autowired
public void setCustomUserEntityManager(CustomUserEntityManager customUserEntityManager){
this.customUserEntityManager=customUserEntityManager;
}
}
4).编写Group的管理工厂类
/**
* 角色类的管理
*/
@Service
public class CustomGroupEntityManagerFactory implements SessionFactory{
@Resource
private CustomGroupEntityManager customGroupEntityManager;
@Override
public Class> getSessionType() {
//返回原始的groupmanager类型
return GroupIdentityManager.class;
}
@Override
public Session openSession() {
//返回自定义的GroupManager实例
return customGroupEntityManager;
}
@Autowired
public void setCustomGroupEntityManager(CustomGroupEntityManager customGroupEntityManager){
this.customGroupEntityManager=customGroupEntityManager;
}
}
5).编写工具类,将我们自定义的实体类转换成Activiti的实体类。
/**
* 将业务中自己定义的用户、角色转化为activiti中使用的user、group
*/
public class ActivitiUserUtils {
public static User toActivitiUser(RocIdUser bUser){
User userEntity=new UserEntity();
userEntity.setId(bUser.getUsername());
userEntity.setFirstName(bUser.getNickname());
userEntity.setLastName(bUser.getNickname());
userEntity.setPassword(bUser.getPassword());
return userEntity;
}
public static GroupEntity toActivitiGroup(RocIdRole sysRole){
GroupEntity groupEntity=new GroupEntity();
groupEntity.setRevision(1);
groupEntity.setType("assignment");
groupEntity.setId(sysRole.getRole());
groupEntity.setName(sysRole.getRole());
return groupEntity;
}
public static List toActivitiGroups(List sysRoles){
List groups=new ArrayList();
for (RocIdRole role:sysRoles
) {
GroupEntity groupEntity=toActivitiGroup(role);
groups.add(groupEntity);
}
return groups;
}
}
6).activiti.cfg.xml中进行配置
4.启动类中引入配置文件
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) //不添加会报错
@ImportResource(locations = {"classpath:activiti.cfg.xml"}) //引入xml配置文件
public class ProcessApplication {
public static void main(String[] args) {
SpringApplication.run(ProcessApplication.class, args);
}
}
总结
其实activiti用户表的重构核心在于编写自定义的实体管理类和工厂类,覆盖activiti原来的方法,在方法中进行增删查改时使用dao接口进行操作,最后将得到的对象转化为activiti的对象,不然会出错。
致谢
activiti 自定义用户:https://blog.csdn.net/meng564764406/article/details/53789958