• Windows 下搭建LDAP服务器


    五一闲来没事,加上项目正在进行UAT。抽空研究了一下LDAP相关知识。随手做一个记录。

    为了方便阅读还是先介绍一下什么是LDAP?

    前言、Lightweight Directory Access Protocol:

    The Lightweight Directory Access Protocol , or LDAP ,is an application protocol for querying and modifying directory services running over TCP/IP .(via wikipedia )。LDAP全称是一个轻量级的目录访问协议,它是建立在TCP/IP基础之上的用来查询和修改目录服务的。这是照着wiki翻译的,但是有人要问了什么是directory Service(目录服务)?

    按照wiki的说法的话讲:在软件行业,目录就如同一个字典,他使得通过某一名称去查找绑定在该名称上的值得方式成为一种可能。有点类似Java中Map的概念。a directory service is simply the software system that stores, organizes and provides access to information in a directory. 一个目录服务就是一个简单的软件系统,在这个目录上提供了存取和组织信息的功能。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表,等等。

    OK,进入正题。Google搜索 windows ldap服务器,终于找到了一个比较好的流行的:OpenLDAP(点击下载)

    一、OpenLDAP安装和配置

    安装还是比较简单的,一直next就好。

    这里记得把上面2个都选上,将LDAP注册为系统的一个服务,默认安装位置:C:Program FilesOpenLDAP,

    进入安装目录,编辑slapd.conf文件:

    找到

    ucdata-path ./ucdata
    include ./schema/core.schema

    在下面加入:(注意你的系统路径,可能随安装位置不同而稍有差异)

    include ./schema/core.schema  (这里是和原来有的,如果加入的话就重复包含了,不能正常启动了。应该除这句外都加入)
    include ./schema/corba.schema
    include ./schema/dyngroup.schema
    include ./schema/java.schema
    include ./schema/misc.schema
    include ./schema/cosine.schema
    include ./schema/nis.schema
    include ./schema/inetorgperson.schema
    include ./schema/openldap.schema

    这个搞定以后,在同一文件后面的(大概65-66行,修改)

    suffix ”o=anotherbug,c=com“   (直接拷贝过去引号会变成中文的。注意引号用英文的,会影响启动)
    rootdn ”cn=manager,o=anotherbug,c=com“

    还有第70行的位置 : rootpw secret,这里要修改为加密后的密码。

    具体操作:

    打开命令行,定位到安装目录下,输入:slappasswd -h {MD5} –s “替换为你想要设置的密码,无引号”

     
     

    将生成的MD5密文:{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==填入原来secret位置。

     

    OK至此配置已经搞定,可以测试一下服务了。打开命令行转到安装目录下输入:sldapd -d 1  注意命令是(slapd -d 1)

    至此LDAP服务器已经搭建并可以跑起来了.下面要来测试怎么倒入.ldif格式的数据了。
     

    二、建立条目(Entry) ,导入 ldif 后缀名文件

    ldif:LDAP Data Interchange Format,基于文本。有两种类型的 LDIF 文件:第一种是描述 Directory 条目数据的,第二种是描述更新条目的。我们主要看怎么描述条目的。

    打开编辑器(如Editplus,UltraEdit等),新建test.ldif内容如下:

    dn: o=anotherbug,c=com
    objectClass: dcObject
    objectClass: organization
    o: anotherbug
    dc: com

    dn: uid=mousepoato, o=anotherbug,c=com
    uid: mousepoato
    objectClass: inetOrgPerson
    mail: paradise.lsj@gmail.com
    userPassword: admin
    labeledURI: http://anotherbug.com/blog
    sn: Li
    cn: test

    注意ldif文件对格式的要求非常严格,属性要以冒号和空格与值隔开,并且其他地方不允许有空格。否则当你导入ldif文件时,会提示出现“ldap_add: Invalid syntax (21)”等诸多错误,另外在我机器上测试,ldif对中文支持也还不好,比如我将最后的cn: test改为 cn: 鼠标土豆,导入就会报错。

    写完保存到安装目录下。在命令行输入:

    ldapadd -c -x -D “cn=manager,o=anotherbug,c=com” -w “刚才替换secret出的密码明文” -f test.ldif

    运行命令后结果如下:

     
     
    注意我们在ldapadd后面加上了 ”–c “ 参数,他会一直运行不会因错误而终止,比如对系统已经存在的entry命令会提示但不会中止。
     

    三、LDAP查看工具

    可能大家看了这么多感觉还是很抽象,我们需要一个GUI看看LDAP到底是个什么东东。

    这里推荐两个浏览工具

    1、LdapBrowser

    这是个Java 开发的 LDAP Browser/Editor 工具,不但跨平台(Windows, Unix-like),而且功能非常完整,速度又快。运行起来的界面时这个样子的。

     

    2、Softrra LDAP Administrator 2009

    这是一个比较强大和专业的客户端,涵盖了大多数企业的LDAP服务类型。

    一直下一步安装成功后,它的配置也是比较简单的:

    新建一个profile,命名为Local_LDAP

     

    配置连接信息

    这是完整配置好后的效果

    四、通过 JNDI api操作LDAP例子

    Javax里面提供的JNDI为我们封装好了对LDAP 的directory service进行存取查询的函数,可以方便实用。

    贴上我用JUnit4写一个对LADP服务器进行测试的代码供参考:


    private static Logger log = Logger.getLogger(TestLdapOper.class);
    DirContext context = null;
    TestLdap tldap = null;

    @Before
    public void init() throws NamingException {
    tldap = new TestLdap();
    context = tldap.getContext();// 获取context
    }

    @Test
    @Ignore
    public void testInsert() throws NamingException {
    tldap.addEntry(context, “uid=IBM,o=anotherbug,c=com”);
    }

    @SuppressWarnings(“unchecked”)
    @Test
    public void testGetAttributes() throws NamingException {
    List attNameList = new ArrayList();
    attNameList.add(“o”);
    attNameList.add(“dc”);
    attNameList.add(“objectClass”);
    Map map = JNDIUitl.getAttributes(context, “o=anotherbug,c=com”, attNameList);
    Iterator keyValuePairs = map.entrySet().iterator();
    for (int i = 0; i < map.size(); i++) {
    Map.Entry entry = (Map.Entry) keyValuePairs.next();
    Object key = entry.getKey();
    Object value = entry.getValue();
    log.info(key + “==key”);
    log.info(value + “–value”);
    }
    }

    @SuppressWarnings(“unchecked”)
    @Test
    public void testGetAttriValues() throws NamingException {
    assertEquals(“anotherbug.com”, JNDIUitl.getAttributeValues(context, “o=anotherbug,c=com”, “dc”).get(0) + “”);
    List lst = new ArrayList();
    lst = JNDIUitl.getAttributeValues(context, “o=anotherbug,c=com”, “objectClass”);
    assertEquals(“organization”, lst.get(1) + “”);
    for (int i = 0; i < lst.size(); i++) {
    log.info(lst.get(i));
    log.info(ReflectionToStringBuilder.toString(lst.get(i)).toString());
    }
    }

    @SuppressWarnings(“unchecked”)
    @Test
    public void testSearchContext() throws NamingException {
    List list = JNDIUitl.searchContextSub(context, “o=anotherbug,c=com”, “(objectClass=*)”);
    for (int i = 0; i < list.size(); i++) {
    log.info(list.get(i));
    }
    }

    @After
    public void destroy() throws NamingException {
    context.close();
    }


    补充

    另外一款LDAP软件 LDAP Admin Tool Professional

    官方地址:http://www.ldapsoft.com/index.html

    C# 到LDAP 验证的代码

    在我的空间文件夹里放着呢(本站的SkyDrive

    http://cid-0a71bbfb566de45c.skydrive.live.com/self.aspx/%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%b1%bb%e6%96%87%e4%bb%b6%e5%a4%b9/ldap4%5E_blog.rar

  • 相关阅读:
    算法分析(3)——冒泡排序真的慢吗?
    算法分析(2)——大O和大Θ
    算法分析(1)——数据的影响和函数的增长
    递归的逻辑(5)——米诺斯的迷宫
    递归的逻辑(4)——递归与分形
    李洪强和你一起学习前端之(9)规避脱标,CSS可见性,滑动门案例
    iOS应用管理(优化)
    iOS开发-应用管理
    iOS开发-Tom猫
    iOS 10.3.3 更新背后的故事
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/4455743.html
Copyright © 2020-2023  润新知