文档章节

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

Bunnykun
 Bunnykun
发布于 2016/04/12 17:45
字数 635
阅读 912
收藏 0

    

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

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


利用JNDI技术连接Active Directory服务

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

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

server.system-info-setting.connect-host localhost
server.system-info-setting.connect-port 10389
server.system-info-setting.security-level simple
server.system-info-setting.user-identification-name cn={0}, ou=system (ldap目录结构)
server.system-info-setting.search-filter *
server.system-info-setting.timeout-time 30000
    获取配置文件信息后便可以通过必要的参数连接服务

    //创建对象名为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;

© 著作权归作者所有

共有 人打赏支持
Bunnykun
粉丝 1
博文 1
码字总数 635
作品 0
广州
程序员
Confluence 6 通过 SSL 连接 LDAP 和 Jira 应用等其他服务

这个页面的文档将会配置 SSL,而不是 Confluence 自己。Atlassian 将会支持 Confluence 使用这个配置,但是我们不能保证能够解决所有你在 SSL 中遇到的问题。请注意,这个页面下面提供的信息...

honeymose
08/07
0
0
译文: Spring Security 与 Active Directory LDAP 例子

Spring Security Active Directory LDAP Example 说明 最近有一个用户需求,让我利用Spring Security结合他们内部的Active Directory (AD) LDAP服务器完成网页程序授权机制. 我搜了很多资料与...

littlebrain4solving
2017/07/27
0
0
Apache Directory Studio连接Weblogic内置LDAP

参考:Connect to WebLogic Embedded LDAP using LDAP Browser OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使...

wffger
07/17
0
0
活动目录(一)

一、域服务概述 Active Directory的directory用来存放用户账号、计算机、打印机与共享文件夹等对象,这些对象的存储位置成为目录数据库。域内提供目录服务的组件是Active Directory Domain S...

kafein
2014/05/30
0
0
java访问ad域

1.活动目录(AD) Active Directory 是用于 Windows Server 的目录服务。 它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用。 Active Directory 目录服务使用结构化...

文艺小青年
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
33
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部