zoukankan      html  css  js  c++  java
  • Activiti 使用自己的身份认证服务

    Activiti 中内置了用户和组管理的服务,由identityService 提供调用接口,默认在spring配置中如下:

    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

    通常我们的系统会有自己的用户认证、授权等机制,这种情况下不会在使用Activiti内置的用户服务,需要将Activiti的身份认证服务指向我们系统自己的服务,需要自己添加一些配置以及实现几个接口。

    1. 自定义user服务

    import java.util.List;
    import java.util.Map;
    
    import org.activiti.engine.identity.Group;
    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.persistence.entity.GroupEntity;
    import org.activiti.engine.impl.persistence.entity.IdentityInfoEntity;
    import org.activiti.engine.impl.persistence.entity.UserEntity;
    import org.activiti.engine.impl.persistence.entity.UserEntityManager;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.google.common.collect.Lists;
    import com.quauq.yanzhenxing.activiti.entity.Role;
    import com.quauq.yanzhenxing.activiti.service.RoleService;
    import com.quauq.yanzhenxing.activiti.service.UserService;
    
    /**
     * 自定义user 服务
     * @author yanzhenxing
     * @createDate 2015年9月17日
     */
    @Service
    public class ActUserEntityService extends UserEntityManager {
    
    	@Autowired
    	private UserService userService;//系统的用户服务
    	
    	@Autowired
    	private RoleService roleService;//系统的角色服务
    	
    	public User createNewUser(String userId) {
    		return new UserEntity(userId);
    	}
    
    	public void insertUser(User user) {
    //		getDbSqlSession().insert((PersistentObject) user);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public void updateUser(UserEntity updatedUser) {
    //		CommandContext commandContext = Context.getCommandContext();
    //		DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
    //		dbSqlSession.update(updatedUser);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public UserEntity findUserById(String userId) {
    //		return (UserEntity) getDbSqlSession().selectOne("selectUserById", userId);
    		return toActivitiUser(userService.obtainUser(userId));
    	}
    
    	private UserEntity toActivitiUser(com.quauq.yanzhenxing.activiti.entity.User user){
    		if (user == null){
    			return null;
    		}
    		UserEntity userEntity = new UserEntity();
    		userEntity.setId(user.getLoginName());
    		userEntity.setFirstName(user.getName());
    		userEntity.setLastName(StringUtils.EMPTY);
    		userEntity.setPassword(user.getPassword());
    		userEntity.setEmail(user.getEmail());
    		userEntity.setRevision(1);
    		return userEntity;
    	}
    	
    	public void deleteUser(String userId) {
    //		UserEntity user = findUserById(userId);
    //		if (user != null) {
    //			List<IdentityInfoEntity> identityInfos = getDbSqlSession().selectList("selectIdentityInfoByUserId", userId);
    //			for (IdentityInfoEntity identityInfo : identityInfos) {
    //				getIdentityInfoManager().deleteIdentityInfo(identityInfo);
    //			}
    //			getDbSqlSession().delete("deleteMembershipsByUserId", userId);
    //			user.delete();
    //		}
    		throw new RuntimeException("not implement method.");
    	}
    
    	public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
    //		return getDbSqlSession().selectList("selectUserByQueryCriteria", query, page);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public long findUserCountByQueryCriteria(UserQueryImpl query) {
    //		return (Long) getDbSqlSession().selectOne("selectUserCountByQueryCriteria", query);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public List<Group> findGroupsByUser(String userId) {
    //		return getDbSqlSession().selectList("selectGroupsByUserId", userId);
    		List<Group> list = Lists.newArrayList();
    		com.quauq.yanzhenxing.activiti.entity.User user = userService.obtainUser(userId);
    		if (user != null){
    			List<Role> roles=roleService.obtainRoles(userId);
    			for (Role role : roles){
    				list.add(toActivitiGroup(role));
    			}
    		}
    		return list;
    	}
    	private  GroupEntity toActivitiGroup(Role role){
    		if (role == null){
    			return null;
    		}
    		GroupEntity groupEntity = new GroupEntity();
    		groupEntity.setId(role.getId());
    		groupEntity.setName(role.getName());
    		groupEntity.setType(role.getType());
    		groupEntity.setRevision(1);
    		return groupEntity;
    	}
    	public UserQuery createNewUserQuery() {
    //		return new UserQueryImpl(Context.getProcessEngineConfiguration().getCommandExecutorTxRequired());
    		throw new RuntimeException("not implement method.");
    	}
    
    	public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId, String key) {
    //		Map<String, String> parameters = new HashMap<String, String>();
    //		parameters.put("userId", userId);
    //		parameters.put("key", key);
    //		return (IdentityInfoEntity) getDbSqlSession().selectOne("selectIdentityInfoByUserIdAndKey", parameters);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public List<String> findUserInfoKeysByUserIdAndType(String userId, String type) {
    //		Map<String, String> parameters = new HashMap<String, String>();
    //		parameters.put("userId", userId);
    //		parameters.put("type", type);
    //		return (List) getDbSqlSession().getSqlSession().selectList("selectIdentityInfoKeysByUserIdAndType", parameters);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public Boolean checkPassword(String userId, String password) {
    //		User user = findUserById(userId);
    //		if ((user != null) && (password != null) && (password.equals(user.getPassword()))) {
    //			return true;
    //		}
    //		return false;
    		throw new RuntimeException("not implement method.");
    	}
    
    	public List<User> findPotentialStarterUsers(String proceDefId) {
    //		Map<String, String> parameters = new HashMap<String, String>();
    //		parameters.put("procDefId", proceDefId);
    //		return (List<User>) getDbSqlSession().selectOne("selectUserByQueryCriteria", parameters);
    		throw new RuntimeException("not implement method.");
    
    	}
    
    	public List<User> findUsersByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
    //		return getDbSqlSession().selectListWithRawParameter("selectUserByNativeQuery", parameterMap, firstResult, maxResults);
    		throw new RuntimeException("not implement method.");
    	}
    
    	public long findUserCountByNativeQuery(Map<String, Object> parameterMap) {
    //		return (Long) getDbSqlSession().selectOne("selectUserCountByNativeQuery", parameterMap);
    		throw new RuntimeException("not implement method.");
    	}
    	
    }
    

    2. 自定义user服务的Factory

    import org.activiti.engine.impl.interceptor.Session;
    import org.activiti.engine.impl.interceptor.SessionFactory;
    import org.activiti.engine.impl.persistence.entity.UserIdentityManager;
    import org.springframework.beans.factory.annotation.Autowired;
    
    /**
     * 自定义user 服务Factory
     * @author yanzhenxing
     * @createDate 2015年9月17日
     */
    public class ActUserEntityServiceFactory implements SessionFactory {
        
        @Autowired
        private ActUserEntityService actUserEntityService;
    
        public Class<?> getSessionType() {
            // 返回原始的UserIdentityManager类型
            return UserIdentityManager.class;
        }
    
        public Session openSession() {
            // 返回自定义的GroupEntityManager实例
            return actUserEntityService;
        }
    
    }

    3. 自定义group服务

    import java.util.List;
    import java.util.Map;
    
    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.persistence.entity.GroupEntity;
    import org.activiti.engine.impl.persistence.entity.GroupEntityManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.google.common.collect.Lists;
    import com.quauq.yanzhenxing.activiti.entity.Role;
    import com.quauq.yanzhenxing.activiti.entity.User;
    import com.quauq.yanzhenxing.activiti.service.RoleService;
    import com.quauq.yanzhenxing.activiti.service.UserService;
    
    /**
     * 自定义 Group服务 
     * @author yanzhenxing
     * @createDate 2015年9月17日
     */
    @Service
    public class ActGroupEntityService extends GroupEntityManager {
    
        @Autowired
        private UserService userService;//系统的用户服务
        
        @Autowired
        private RoleService roleService;//系统的角色服务
    
        public Group createNewGroup(String groupId) {
            return new GroupEntity(groupId);
        }
    
        public void insertGroup(Group group) {
    //        getDbSqlSession().insert((PersistentObject) group);
            throw new RuntimeException("not implement method.");
        }
    
        public void updateGroup(GroupEntity updatedGroup) {
    //        CommandContext commandContext = Context.getCommandContext();
    //        DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
    //        dbSqlSession.update(updatedGroup);
            throw new RuntimeException("not implement method.");
        }
    
        public void deleteGroup(String groupId) {
    //        GroupEntity group = getDbSqlSession().selectById(GroupEntity.class, groupId);
    //        getDbSqlSession().delete("deleteMembershipsByGroupId", groupId);
    //        getDbSqlSession().delete(group);
            throw new RuntimeException("not implement method.");
        }
    
        public GroupQuery createNewGroupQuery() {
    //        return new GroupQueryImpl(Context.getProcessEngineConfiguration().getCommandExecutorTxRequired());
            throw new RuntimeException("not implement method.");
        }
    
    //    @SuppressWarnings("unchecked")
        public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {
    //        return getDbSqlSession().selectList("selectGroupByQueryCriteria", query, page);
            throw new RuntimeException("not implement method.");
        }
    
        public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
    //        return (Long) getDbSqlSession().selectOne("selectGroupCountByQueryCriteria", query);
            throw new RuntimeException("not implement method.");
        }
    
        public List<Group> findGroupsByUser(String userId) {
    //        return getDbSqlSession().selectList("selectGroupsByUserId", userId);
            List<Group> list = Lists.newArrayList();
            User user = userService.obtainUser(userId);
            if (user != null){
                List<Role> roles=roleService.obtainRoles(userId);
                for (Role role : roles){
                    list.add(toActivitiGroup(role));
                }
            }
            return list;
        }
        
        private  GroupEntity toActivitiGroup(Role role){
            if (role == null){
                return null;
            }
            GroupEntity groupEntity = new GroupEntity();
            groupEntity.setId(role.getId());
            groupEntity.setName(role.getName());
            groupEntity.setType(role.getType());
            groupEntity.setRevision(1);
            return groupEntity;
        }
        
        public List<Group> findGroupsByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
    //        return getDbSqlSession().selectListWithRawParameter("selectGroupByNativeQuery", parameterMap, firstResult, maxResults);
            throw new RuntimeException("not implement method.");
        }
    
        public long findGroupCountByNativeQuery(Map<String, Object> parameterMap) {
    //        return (Long) getDbSqlSession().selectOne("selectGroupCountByNativeQuery", parameterMap);
            throw new RuntimeException("not implement method.");
        }
    
    }

    4. 自定义 group服务的Factory

    import org.activiti.engine.impl.interceptor.Session;
    import org.activiti.engine.impl.interceptor.SessionFactory;
    import org.activiti.engine.impl.persistence.entity.GroupIdentityManager;
    import org.springframework.beans.factory.annotation.Autowired;
    
    /**
     * 自定义Group服务Factory
     * @author yanzhenxing
     * @createDate 2015年9月17日
     */
    public class ActGroupEntityServiceFactory implements SessionFactory {
        
        @Autowired
        private ActGroupEntityService actGroupEntityService;
        
        public Class<?> getSessionType() {
            // 返回原始的GroupIdentityManager类型
            return GroupIdentityManager.class;
        }
    
        public Session openSession() {
            // 返回自定义的GroupEntityManager实例
            return actGroupEntityService;
        }
    
    }

    5. 修改spring的配置

    在processEngineConfiguration配置中添加属性

            <!-- 自定义用户组服务 -->
            <property name="customSessionFactories"> 
                <list>
                    <bean class="com.quauq.yanzhenxing.activiti.service.ext.ActUserEntityServiceFactory"/>
                    <bean class="com.quauq.yanzhenxing.activiti.service.ext.ActGroupEntityServiceFactory"/>
                </list>
            </property>

    经过上面的配置和接口实现,就可以将Activiti中的身份认证服务指向系统的相关服务,user和group服务中的实现方法根据系统需求而定。

    关于Activiti的学习内容,推荐大家多看看咖啡兔的博客以及他的github的例子,肯定会受益匪浅的。

  • 相关阅读:
    5.6Java 创建File
    5.6Java File ApI
    Java字符集乱码
    5.17Java文件的拷贝
    5.10Java实操IO流,面向接口编程,面向父类编程
    5.6Java File对象使用递归打印子孙级目录以及文件的名称
    5.10JavaIo流四大抽象类
    5.17Java文件字节流
    5.7通过Maven配置seleeniumjava依赖
    5.6Java多态的介绍
  • 原文地址:https://www.cnblogs.com/yanzhenxing/p/4864665.html
Copyright © 2011-2022 走看看