activiti6中自定义用户和组实现

1808

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;
    }
}