如何连接ldap active directory服务并从中获取数据

    

    最近在公司写内设文档, 发现用户登录时, 需要连接访问active directory服务并获取里面存储的用户数据, 进行域控处理。我, 刚出来, 看着其实挺懵的, 便马上上网查资料了。

    总体来说, ldap是一种数据存储的东西, 一种树状结构的目录, 能提高检索数据的效率,  active directory是微软提供的ldap服务。关于概念的部分, 当然还是需要大家的补充, 下面我将具体连接和获取数据的java代码写下来, 以供大家参(#‵′)kao。


利用JNDI技术连接Active Directory服务

    首先, 你需要封装连接active directory服务的参数对象

    (可以将连接参数都存放在poperties文件中, 方便修改)

server.system-info-setting.connect-hostlocalhost
server.system-info-setting.connect-port10389
server.system-info-setting.security-levelsimple
server.system-info-setting.user-identification-namecn={0}, ou=system (ldap目录结构)
server.system-info-setting.search-filter*
server.system-info-setting.timeout-time30000
    获取配置文件信息后便可以通过必要的参数连接服务

    //创建对象名为env的Hashtable<String, String>集合 
    Hashtable<String, String> env = new Hashtable<>(); 
    //设置初始化Context Factory 
    env.put(DirContext.INITIAL_CONTEXT_FACTORY, LDAP_CONTEXT_FACTORY); 
    //设置LDAP目标URL 
    String url = MessageFormat.format(PROVIDER_URL, host, port); 
    env.put(DirContext.PROVIDER_URL, url); 
    //设置安全级别 
    env.put(DirContext.SECURITY_AUTHENTICATION, level); 
    //设置LDAP识别名 
    env.put(DirContext.SECURITY_PRINCIPAL, dn); 
    //设置密码 
    env.put(DirContext.SECURITY_CREDENTIALS, password); 
    //设置连接等待时长 
    env.put("com.sun.jndi.ldap.connect.timeout", timeout); 
    //设置JNDI参数 
    env.put("com.sun.jndi.ldap.connect.pool", "true"); 
    env.put("com.sun.jndi.connect.pool.debug", "all"); 
    //创建实例区连接Active Directory 
    //dircon是DirContext类的对象
    dircon = new InitialDirContext(env);

获取信息

    在检索active directory服务中信息时, 可以传递dn作为用户标识去获取匹配的用户信息, 并且也能过滤相对应的字符串信息

        SearchControls searchControls = new SearchControls();
        //设置SearchControls的范围
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        //检索用户信息
        NamingEnumeration<SearchResult> result = dircon.search(dn, filter, searchControls);

        if (!result.hasMore())
            //MESSAGE_FAILURE_SEARCH : 检索失败
            throw new Exception(MESSAGE_FAILURE_SEARCH);

        //获取下一行信息
        SearchResult searchResult = result.next();
        //获取数据所有属性
        NamingEnumeration<?> attributes = searchResult.getAttributes().getAll();

        //创建一个Map对象
        Map<String, Object> resultMap = new HashMap<String, Object>();

        //循环遍历属性集合
        while (attributes.hasMore()) {
            //获取单个属性
            Attribute attr = (Attribute) attributes.nextElement();
            //获取单个值
            Enumeration<?> values = attr.getAll();
            if (values.hasMoreElements())
                resultMap.put(attr.getID(), values.nextElement());
        }

        if (resultMap.isEmpty())
        、  //MESSAGE_FAILURE_SEARCH : 检索失败
            throw new Exception(MESSAGE_FAILURE_SEARCH);
        //获取数据后返回Map集合
        return resultMap;

转载于:https://my.oschina.net/Bunnykun/blog/657494

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值