zoukankan      html  css  js  c++  java
  • activiti 自定义用户

    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用户数据的多种方案比较》

  • 相关阅读:
    面向对象设计技巧[Object Oriented Design Tips] 2
    面向对象设计的技巧[Object Oriented Design Tips]1
    36家示范性软件学院验收的得分排名顺序
    解决windows系统乱码(其实是法语)
    [maven] maven/appfuse 常用命令介绍
    [plsql] win7/64位 PL/SQL登录时报 ora12154无法解析指定的连接标识
    [maven] pom.xml常用配置介绍
    web.xml中classpath:和classpath*:的区别
    [http] 深入理解HTTP消息头
    [Hibernate] Hibernate连接mysql示范
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/11309798.html
Copyright © 2011-2022 走看看