https://blog.csdn.net/meng564764406/article/details/53789958

此文目的:

对网络上的关于对activiti 使用做一个总结,因为很难找到一个非常完整的代码结构。以后大家不用再东拼西凑。

本文是重写activiti的 用户部分,使用自定义管理器,也就是说不再使用act_id_*的数据库表。

一共创建或者修改6个文件。

1.CustomUserEntityManagerFactory.java

这是需要创建的第一个文件,是自定义的User的管理工厂类。

@Service
        public class CustomUserEntityManagerFactory implements SessionFactory{
            // 使用自定义的User管理类
            @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;
            }
            
        }

2.CustomGroupEntityManagerFactory.java

这是自定义Group管理工厂,也就是我们权限中的角色类的管理了。

@Service
    public class CustomGroupEntityManagerFactory implements SessionFactory{
        
        @Resource
        private CustomGroupEntityManager customGroupEntityManager;
        
        public Class<?> getSessionType() {
            // 返回原始的GroupManager类型
            return GroupEntityManager.class;
        }
     
        public Session openSession() {
            // 返回自定义的GroupManager实例
            return customGroupEntityManager;
        }
     
        @Autowired
        public void setCustomGroupEntityManager(CustomGroupEntityManager customGroupEntityManager) {
            this.customGroupEntityManager = customGroupEntityManager;
        }
    }

3.CustomUserEntityManager.java

这是自定义用户管理类,管理用户方法。这里仅仅列举了两个方法,实际需求再去添加,具体方法进入UserEntityManager中查看。

@Component
    public class CustomUserEntityManager extends UserEntityManager{
        
        private static final Log logger = LogFactory.getLog(CustomUserEntityManager.class);
     
        @Autowired
        private UserMapper userMapper;
     
        @Override
        public UserEntity findUserById(String userId) {
            UserEntity userEntity = new UserEntity();
            com.mlf.activiti.entity.User cue = userMapper.getUserByUserName(userId);//这是我们的dao方法查询回来的方法,是自己定义的user
            userEntity = ActivitiUserUtils.toActivitiUser(cue);//将自定义的user转化为activiti的类
            return userEntity;//返回的是activiti的实体类
        }
     
        @Override
        public List<Group> findGroupsByUser(final String userCode) {
            if (userCode == null)
                return null;
     
            List<Role> groupIds = userMapper.getGroupIdsByUserName(userCode);
     
            List<Group> gs = null;
            gs = ActivitiUserUtils.toActivitiGroups(groupIds);
            return gs;
     
        }
    }

4.CustomGroupEntityManager .java

自定义组(角色)管理,具体方法进入GroupEntityManager中查看。

@Component
    public class CustomGroupEntityManager  extends GroupEntityManager{
        
        private static final Log logger = LogFactory.getLog(CustomGroupEntityManager.class);
     
        @Autowired
        private UserMapper userMapper;//用于查询实际业务中用户表、角色等表
     
        @Override
        public List<Group> findGroupsByUser(final String userCode) {
            if (userCode == null)
                return null;
     
            List<Role> bGroupList = userMapper.getGroupByUserName(userCode);
     
            List<Group> gs = new java.util.ArrayList<>();
            GroupEntity g;
            String roleId;
            String activitRole;
            for (Role bGroup : bGroupList) {
                g = new GroupEntity();
                g.setRevision(1);
                g.setType("assignment");
                roleId = String.valueOf(bGroup.getId());
    //            activitRole = bindGroupWithRole.get(roleId);//此处只是根据RoleId获取RoleCode, 因实际表中无RoleCode字段,暂且如此实际,此行可注释掉
                g.setId(/*activitRole != null ? activitRole :*/ roleId);
                g.setName(bGroup.getName());
                gs.add(g);
            }
            return gs;
        }
    }

5.ActivitiUserUtils .java

这个工具类用来将业务中自己定义的用户转化为activiti中使用的user。

public class ActivitiUserUtils {
        public static UserEntity toActivitiUser(User bUser){  
            UserEntity userEntity = new UserEntity();  
            userEntity.setId(bUser.getName());  
            userEntity.setFirstName(bUser.getUsername());  
            userEntity.setLastName(bUser.getName());  
            userEntity.setPassword(bUser.getPassword());  
            userEntity.setEmail(bUser.getEmail());  
            userEntity.setRevision(1);  
            return userEntity;  
        }  
      
        public static GroupEntity toActivitiGroup(Role sysRole){  
            GroupEntity groupEntity = new GroupEntity();  
            groupEntity.setRevision(1);  
            groupEntity.setType("assignment");  
            groupEntity.setId(sysRole.getId());  
            groupEntity.setName(sysRole.getName());  
            return groupEntity;  
        }  
      
        public static List<Group> toActivitiGroups(List<Role> sysRoles){  
            List<Group> groups = new ArrayList<Group>();  
            for (Role sysRole : sysRoles) {  
                GroupEntity groupEntity = toActivitiGroup(sysRole);  
                groups.add(groupEntity);  
            }  
            return groups;  
        }
     
    }

6.spring-activiti.xml

这里指定定义以上的bean对象的生成,用来依赖注入。

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
            <property name="dataSource" ref="dataSource" />
            <property name="transactionManager" ref="transactionManager" />
            <property name="databaseSchemaUpdate" value="true" />
            
            <!-- 自定义用户、用户组的配置 -->  
            <property name="customSessionFactories">  
                 <list>  
                     <bean class="com.mlf.activiti.custom.CustomUserEntityManagerFactory" >  
                         <property name="customUserEntityManager" ref="customUserEntityManager"/>
                     </bean>  
                     <bean class="com.mlf.activiti.custom.CustomGroupEntityManagerFactory" >  
                         <property name="customGroupEntityManager" ref="customGroupEntityManager"/>
                     </bean>  
                 </list>  
            </property>
        </bean>
        
        <bean id="customUserEntityManager" class="com.mlf.activiti.custom.manager.CustomUserEntityManager"/>
        <bean id="customGroupEntityManager" class="com.mlf.activiti.custom.manager.CustomGroupEntityManager"/>

7.这样基本的配置全都结束了,哪里还有不足呢,比如说,3,4,5,中Role.java需要写,这个就是一个user类换了个名字嘛,很简单;另一个是我们基本都是用mybatis的,在3,4,中使用的mapper就是我们需要自己编码的dao层接口,和对应的mapper文件。这里就不多叙述了。

在以后使用用户,或者角色,就通过我们定义的管理器来控制。

注意,有的方法我们没有实现,如果调用的话,一旦访问act_id_*的数据,会出现我们不想要的数据。

下面两篇文章可以帮助深入理解,不过具体实例还是看我的上述代码,比较好。

如有错误,欢迎指出,评论,一起探讨。欢迎各位一起交流,我的邮箱公开。

推荐文章:浅谈Activiti工作流引擎用户管理

推荐文章:《同步或者重构Activiti Identify用户数据的多种方案比较》

activiti 自定义用户的更多相关文章

  1. 2016.11.29 activiti实战--第19章--统一身份管理(含自定义用户与数组的实现)

    学习资料:<Activiti实战> 第十九章 统一身份管理 本章讲解如何统一业务系统与activiti的用户管理系统. 第5章的时候已经讲解过activiti的用户与组.一般来说业务系统都 ...

  2. activiti自定义流程之整合(二):使用angular js整合ueditor创建表单

    注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义 ...

  3. activiti自定义流程之自定义表单(二):创建表单

    注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...

  4. activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 1.maven导包,这里就没有什么多的好说了,直接代码: <depe ...

  5. 关于我上传的activiti自定义流程demo的说明

    最近又收到了一些询问activiti的问题,其中好几个都是向我索要我上传的这个activiti自定义流程demo的数据库设计. 索要的多了,而我早就把这个库给删掉了,所以我便觉得有必要做一个说明: 我 ...

  6. 同步或者重构Activiti Identify用户数据的多种方案比较

    http://www.kafeitu.me/activiti/2012/04/23/synchronize-or-redesign-user-and-role-for-activiti.html 如何 ...

  7. 基于Activiti5.15.1 自定义用户、组(User,Group)实现

    基于Activiti5.15.1 自定义用户.组(User,Group)实现 本人刚接触Activiti,最近工作中需要将Activiti中原有的用户,组(ACT_ID_USER,ACT_ID_GRO ...

  8. openfire使用自定义用户表

    转自:http://blog.csdn.net/nomousewch/article/details/7546083 在最近的项目中使用openfire服务器实现消息推送功能,如果使用openfire ...

  9. .NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。

    备用收藏,http://blog.csdn.net/msdnxgh/article/details/6894885 .NET 实现自定义ContextUser的Identity和Principal 在 ...

随机推荐

  1. 利用chocolatey软件包管理工具安装yarn,比npm更快更稳定

    Chocolatey 是一个 Windows 专用的软件包管理工具. Yarn 对你的代码来说是一个包管理器, 你可以通过它使用全世界开发者的代码, 或者分享自己的代码.Yarn 做这些快捷.安全.可 ...

  2. 【Docker】docker安装redis

    一.下载镜像并运行容器 1.指定redis.conf配置文件方式运行 docker run -p 6379:6379 --name myredis -v $PWD/conf/redis.conf:/e ...

  3. LINUX下查看日志信息

    Linux下grep显示多行信息标准unix/linux下的grep通过以下参数控制上下文 grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行 例如 grep -C ...

  4. termux 为 python3 添加 numpy 库

    1 本机环境 Termux v0.77 python3.8 2 配置步骤 2.1 安装 python 和 ipython apt updateapt upgradepkg install python ...

  5. 18、DKN(Deep Knowledge-Aware Network for News Recommendation)---新闻推荐

    摘自:https://blog.csdn.net/qq_40006058/article/details/89678866 DKN:Deep Knowledge-Aware Network for N ...

  6. 全球百大最有前景AI公司出炉,中国成独角兽最强诞生地

    https://new.qq.com/omn/20190210/20190210B0BVK2.html 硅谷最强智库之一的 CB Insights 日前发布 AI 100 2019 报告,在这 100 ...

  7. 学习Spring-Data-Jpa(十一)---抓取策略与实体图

    1.抓取策略 在前面说到的关联关系注解中,都有一个fetch属性,@OneToOne.@ManyToOne中都默认是FetchType.EAGER,立即获取.@OneToMany.@ManyToMan ...

  8. [NPM + React] Prepare a Custom React Hook to be Published as an npm Package

    Before we publish our package, we want to make sure everything is set up correctly. We’ll cover vers ...

  9. HTML 009 select_jquery操作下拉框select

    取值问题 <select id="selector"> <option value="1">选项一</option> < ...

  10. gerrit配置跳过审核直接push到gitlab

    项目中有存放项目相关的文档,这些项目需要配置跳过审核再提交的操作.现在需要给某些组配置不审核直接提交的权限 方法: 使用管理员账号,到 projects -> access 页面下配置 refe ...