Java导出Ldap服务器数据

最近花了几天时间研究了下ldap服务器,并且把数据同步到mysql数据库中,下面是写的一个导出工具类

package com.util;


import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import javax.naming.ldap.LdapName;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import static java.util.Objects.nonNull;

/**
 * Created by ccl on 2018/6/20.
 */
public class LdapUtils {
    public static Map<String,String> organizaCNName = new Hashtable<>();//组织机构中文名称

    //protected final static Logger logger = LoggerFactory.getLogger(LdapUtils.class);
    private static LdapContext dc = null;
    private static final String LDAP_URL = "ldap://***:389";// LDAP访问地址
    private static final String root = "dc=*,dc=com";// LDAP的根节点的DC
    private static final String ADMINUSERNAME = "";  // 用户名,就是dn,例如(uid=student1,ou=class1,ou=school1,dc=*,dc=com)
    private static final String ADMINPASSWORD = "";// 密码

    //base   :根节点"dc=*,dc=com"
    //scope  :搜索范围,分为"base"(本节点),"one"(单层),""(遍历)
    //filter :指定子节点(格式为"(objectclass=*)",*是指全部,也可以制定具体类型 比如objectClass=organizationalUnit,查询的是部门信息
    //查询用户信息
    private static final String SEARCH_USER_BASE ="ou=class1,dc=*,dc=com";
    private static final String SEARCH_USER_SCOPE ="";//为空,则遍历当前选的条目里满足filter的所有类型的信息
    private static final String SEARCH_USER_FILTER ="(objectClass=organizationalUnit)";//要加括号,查询属性名为objectClass,值为organizationalUnit

    /**
     * 初始化连接
     */
    public static void init() {
        Hashtable env = new Hashtable();

        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, LDAP_URL);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, ADMINUSERNAME);
        env.put(Context.SECURITY_CREDENTIALS, ADMINPASSWORD);
        try {
            dc = new InitialLdapContext(env,null);// 初始化上下文
            //logger.info("初始化成功");
        } catch (javax.naming.AuthenticationException e) {
            //logger.error("初始化失败:"+e.getMessage());
        } catch (Exception e) {
            //logger.error("初始化出错:"+e.getMessage());
        }
    }

    /**
     * 关闭Ldap连接
     */
    public static void close() {
        if (dc != null) {
            try {
                dc.close();
            } catch (NamingException e) {
                //logger.error("Ldap服务关闭异常:"+e.getMessage());
            }
        }
    }


    /**
     *查询ldat服务器获取所有用户数据
     */
    public static List<LdaptUserResult> searchInformation() {

        SearchControls sc = new SearchControls();
        if (SEARCH_USER_SCOPE.equals("base")) {
            sc.setSearchScope(SearchControls.OBJECT_SCOPE);
        } else if (SEARCH_USER_SCOPE.equals("one")) {
            sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
        } else {
            sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
        }
        NamingEnumeration ne = null;
        LdaptUserResult ldaptUserResult = null;
        List<LdaptUserResult> list = new ArrayList<LdaptUserResult>();
        try {
            ne = dc.search(new LdapName(SEARCH_USER_BASE), SEARCH_USER_FILTER, sc);
            while (ne.hasMore()) {
                ldaptUserResult = new LdaptUserResult();
                SearchResult sr = (SearchResult) ne.next();

                String name = sr.getNameInNamespace();//这里的name可以获取当前条目的全路径



                Attributes at = sr.getAttributes();
                NamingEnumeration ane = at.getAll();
                while (ane.hasMore()) {
                    Attribute attr = (Attribute) ane.next();
                    String attrType = attr.getID();//attrType对应的是属性名
                    NamingEnumeration values = attr.getAll();

                    // Another NamingEnumeration object, this time
                    // to iterate through attribute values.
                    while (values.hasMore()) {
                        Object oneVal = values.nextElement();
                        //组装成对象
                        combinationUser(ldaptUserResult,attrType,oneVal);
                    }
                }
                list.add(ldaptUserResult);
            }
        } catch (Exception nex) {
            //logger.error("查询ldpat用户数据错误:"+nex.getMessage());

        }

        return list;
    }



    private static void combinationUser(LdaptUserResult ldaptUserResult, String attrType,Object oneVal) {
        if(nonNull(oneVal)){
            switch (attrType){
                case "displayName":
                    ldaptUserResult.setName((String) oneVal);
                    break;
                case "uid":
                    ldaptUserResult.setUsername((String) oneVal);
                    break;
                case "mail":
                    ldaptUserResult.setEmail((String) oneVal);
                    break;
                default:
            }
        }
    }


    public static void main(String[] args) {
        LdapUtils.init();
        LdapUtils.searchInformation();
        LdapUtils.close();
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值