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. 复盘一篇讲sklearn库学习文章(上)

    认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklea ...

  2. Apache 正向代理与反向代理配置

    Apache提供了 mod_proxy 模块用于提供代理服务,能够支持的包括正向代理.反向代理.透明代理.缓存.负载均衡,HTTP代理.FTP代理.SSL代理等若干强大的功能. 配置代理方法很简单那, ...

  3. 基于gtk的imshow:用gtk读取并显示图像

    gtk实现imshow,最naive的做法是用gtk的组件去读取图像,然后show出来:后续再考虑用GTK显示用别的方式例如stb image读取的图像.先前基于GDI实现imshow时也是这一思路, ...

  4. 整型 字符串方法 for循环

    整型 # 整型 -- 数字 (int) # 用于比较和运算的 # 32位 -2 ** 31 ~ 2 ** 31 -1 # 64位 -2 ** 63 ~ 2 ** 63 -1 # + - * / // ...

  5. Gerrit代码评审流程

    Gerrit代码评审流程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.代码评审流程(如下图所示) 第一步:贡献者报建一个提交,并通过之前从gerrit下载的commit-ms ...

  6. 一个线上JVM的CPU资源占用过高问题的排查

    原文:https://www.iteye.com/blog/tyrion-2293369 上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题 ...

  7. CVE-2019-5475:Nexus2 yum插件RCE漏洞复现

    0x00 前言 如果有想一起做漏洞复现的小伙伴,欢迎加入我们,公众号内点击联系作者即可 提示:由于某些原因,公众号内部分工具即将移除,如果有需要的请尽快保存 0x01 漏洞概述 最近hackerone ...

  8. C++学习(1)—— 初识C++

    1. 变量 作用:给一段指定的内存空间起名,方便操作这段内存空间 语法:数据类型 变量名称=变量初始值​ #include<iostream> using namespace std; i ...

  9. 微信小程序~模板template引用

    当您的项目需要多次使用同一个布局和样式的时候,您就可以考虑使用template(模板)来减少冗余代码. 使用方式: 1.新建一个template文件夹来存放您的通用模板: 2.在文件夹里面新建一个wx ...

  10. formData上传文件

    需要将选中的xml传到后台,通过xslt转换为html html: <form id="uploadForm" enctype="multipart/form-da ...