activiti 自定義用戶

http://www.javashuo.com/article/p-nbnjsxyg-kz.htmljava

 

此文目的:

    對網絡上的關於對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用戶數據的多種方案比較》spring

相關文章
相關標籤/搜索