activiti6中自定义用户和组实现
activiti6中自定义用户和组实现
目前网上的解决方案都是基于activiti5.22版本的,但是对于activiti6搜了半天也没有找到方法,官方文档的配置也只是稍微带过,经过几天折腾终于可以成功替换
1.首先实现UserEntityManager, Session接口编写CustomUserEntityManager
package com.test.process.common.config.process;
import com.test.entity.dto.role.Role;
import com.test.process.common.utils.ActivitiUserUtil;
import com.test.service.IRoleService;
import com.test.service.IUserService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.Picture;
import org.activiti.engine.identity.User;
import org.activiti.engine.identity.UserQuery;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.UserQueryImpl;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.impl.persistence.entity.UserEntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class CustomUserEntityManager implements UserEntityManager, Session {
@Autowired
IUserService userService;
@Autowired
IRoleService roleService;
@Override
public UserEntity findById(String userAccount) {
com.fh.entity.dto.user.User user = userService.getUserByAccout(userAccount);
if (user != null) {
return ActivitiUserUtil.toActivitiUser(user);
}
return null;
}
@Override
public List<Group> findGroupsByUser(String userAccount) {
List<Role> roleList = roleService.getRoleByUserAccount(userAccount);
return ActivitiUserUtil.toActivitiGroups(roleList);
}
@Override
public List<User> findUserByQueryCriteria(UserQueryImpl userQuery, Page page) {
com.fh.entity.dto.user.User user = userService.getUserByAccout(userQuery.getId());
List<User> userList = new ArrayList<>();
if (user != null) {
userList.add(ActivitiUserUtil.toActivitiUser(user));
}
return userList;
}
@Override
public long findUserCountByQueryCriteria(UserQueryImpl userQuery) {
throw new RuntimeException("not implement method.");
}
@Override
public List<User> findUsersByNativeQuery(Map<String, Object> map, int i, int i1) {
throw new RuntimeException("not implement method.");
}
@Override
public long findUserCountByNativeQuery(Map<String, Object> map) {
throw new RuntimeException("not implement method.");
}
@Override
public User createNewUser(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public void updateUser(User user) {
throw new RuntimeException("not implement method.");
}
@Override
public UserQuery createNewUserQuery() {
throw new RuntimeException("not implement method.");
}
@Override
public Boolean checkPassword(String s, String s1) {
throw new RuntimeException("not implement method.");
}
@Override
public boolean isNewUser(User user) {
throw new RuntimeException("not implement method.");
}
@Override
public Picture getUserPicture(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public void setUserPicture(String s, Picture picture) {
throw new RuntimeException("not implement method.");
}
@Override
public void deletePicture(User user) {
throw new RuntimeException("not implement method.");
}
@Override
public UserEntity create() {
throw new RuntimeException("not implement method.");
}
@Override
public void insert(UserEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public void insert(UserEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public UserEntity update(UserEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public UserEntity update(UserEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(UserEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(UserEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public void flush() {
//do nothing
}
@Override
public void close() {
//do nothing
}
}
2.实现SessionFactory编写CustomUserEntityManagerFactory
package com.test.process.common.config.process;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.engine.impl.persistence.entity.UserEntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/*
* 重写activity的用户管理接口
* @author nealzhi
* @date 2020-04-27
* */
@Component
public class CustomUserEntityManagerFactory implements SessionFactory {
@Autowired
CustomUserEntityManager customUserEntityManager;
@Override
public Class<?> getSessionType() {
return UserEntityManager.class;
}
@Override
public Session openSession(CommandContext commandContext) {
return customUserEntityManager;
}
}
3.实现GroupEntityManager, Session编写CustomGroupEntityManager
package com.test.process.common.config.process;
import com.test.entity.dto.role.Role;
import com.test.process.common.utils.ActivitiUserUtil;
import com.test.service.IRoleService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.GroupQuery;
import org.activiti.engine.impl.GroupQueryImpl;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.GroupEntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class CustomGroupEntityManager implements GroupEntityManager, Session {
@Autowired
IRoleService roleService;
@Override
public List<Group> findGroupsByUser(String userAccount) {
List<Role> roleList = roleService.getRoleByUserAccount(userAccount);
return ActivitiUserUtil.toActivitiGroups(roleList);
}
@Override
public List<Group> findGroupByQueryCriteria(GroupQueryImpl groupQuery, Page page) {
throw new RuntimeException("not implement method.");
}
@Override
public long findGroupCountByQueryCriteria(GroupQueryImpl groupQuery) {
throw new RuntimeException("not implement method.");
}
@Override
public List<Group> findGroupsByNativeQuery(Map<String, Object> map, int i, int i1) {
throw new RuntimeException("not implement method.");
}
@Override
public long findGroupCountByNativeQuery(Map<String, Object> map) {
throw new RuntimeException("not implement method.");
}
@Override
public Group createNewGroup(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public GroupQuery createNewGroupQuery() {
throw new RuntimeException("not implement method.");
}
@Override
public boolean isNewGroup(Group group) {
throw new RuntimeException("not implement method.");
}
@Override
public GroupEntity create() {
throw new RuntimeException("not implement method.");
}
@Override
public GroupEntity findById(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public void insert(GroupEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public void insert(GroupEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public GroupEntity update(GroupEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public GroupEntity update(GroupEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(String s) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(GroupEntity entity) {
throw new RuntimeException("not implement method.");
}
@Override
public void delete(GroupEntity entity, boolean b) {
throw new RuntimeException("not implement method.");
}
@Override
public void flush() {
//do nothing
}
@Override
public void close() {
//do nothing
}
}
4.实现SessionFactory编写CustomGroupEntityManagerFactory
package com.test.process.common.config.process;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.engine.impl.persistence.entity.GroupEntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/*
* 重写activity的用户管理接口
* @author nealzhi
* @date 2020-04-27
* */
@Component
public class CustomGroupEntityManagerFactory implements SessionFactory {
@Autowired
CustomGroupEntityManager customGroupEntityManager;
@Override
public Class<?> getSessionType() {
return GroupEntityManager.class;
}
@Override
public Session openSession(CommandContext commandContext) {
return customGroupEntityManager;
}
}
5.编写ActivitiConfiguration配置类,通过@Configuration来注入
package com.test.process.common.config.process;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class ActivitiConfiguration implements ProcessEngineConfigurationConfigurer {
@Autowired
private CustomUserEntityManagerFactory customUserEntityManagerFactory;
@Autowired
private CustomGroupEntityManagerFactory customGroupEntityManagerFactory;
@Autowired
CustomUserEntityManager customUserEntityManager;
@Autowired
CustomGroupEntityManager customGroupEntityManager;
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setDatabaseType("mysql");
// 流程图字体
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
// 配置自定义的用户和组管理
processEngineConfiguration.setUserEntityManager(customUserEntityManager);
processEngineConfiguration.setGroupEntityManager(customGroupEntityManager);
//设置自定义用户和组管理的工厂
List<SessionFactory> customSessionFactories = new ArrayList<>();
customSessionFactories.add(customUserEntityManagerFactory);
customSessionFactories.add(customGroupEntityManagerFactory);
processEngineConfiguration.setCustomSessionFactories(customSessionFactories);
}
}
6.上述所用到的工具类
import org.activiti.engine.identity.Group;
import org.activiti.engine.impl.persistence.entity.GroupEntityImpl;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.impl.persistence.entity.UserEntityImpl;
import java.util.ArrayList;
import java.util.List;
public class ActivitiUserUtil {
//这里的user和role对应自己组织架构的实体类,请自行实现
public static UserEntity toActivitiUser(User user) {
UserEntityImpl userEntity = new UserEntityImpl();
userEntity.setId(user.getId().toString());
userEntity.setFirstName(user.getAccount());
userEntity.setLastName("");
userEntity.setPassword("");
userEntity.setEmail("");
return userEntity;
}
public static Group toActivitiGroup(Role role) {
Group activitiGroup = new GroupEntityImpl();
activitiGroup.setId(role.getRoleName());
activitiGroup.setName(role.getDescription());
activitiGroup.setType("assignment");
return activitiGroup;
}
public static List<Group> toActivitiGroups(List<Role> roleList) {
List<Group> groups = new ArrayList<>();
for (Role item : roleList) {
Group group = toActivitiGroup(item);
groups.add(group);
}
return groups;
}
public static List<Group> toActivitiGroupsSingle(Role role) {
List<Group> groups = new ArrayList<>();
Group group = toActivitiGroup(role);
groups.add(group);
return groups;
}
}