• (转载)Windows下OpenLDAP的安装及使用


    一 、什么是LDAP

    LDAP:(轻量级目录访问协议,Lightweight Directory AccessProtocol)

           它是基于 X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。

    目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它成树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据 库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,数据修改使用简单的锁定机制实现All-or-Nothing,不适于存储修 改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。现在国际上的目录服务标准有两个,一个是较早的X.500标准,一个是较新的LDAP标 准。        LDAP诞生的目标是快速响应和大容量查询并且提供多目录服务器的信息复制功能,它为读密集型的操作进行专门的 优化。因此,当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。

    LDAP常用术语解释: DN:distinguished name。在LDAP目录中的所有记录项都有一个唯一的DN CN,OU,DC都是LDAP连接服务器的端字 符串中的区别名称; LDAP连接服务器的连接字串格式为:ldap://servername/DN 其中DN有三个属性,分别是CN,OU,DC  LDAP是一种通讯协议,如同HTTP是一种协议一样的!在LDAP目录中。 uid    (User ID) CN     (Common   Name)           DC     (Domain   Component)   域名元素       OU     (Organizational   Unit)  SN    (surname)  An LDAP 目录类似于文件系统目录.     下列目录:      DC=redmond,DC=wa,DC=microsoft,DC=com      如果我们类比文件系统的话,可被看作如下文件路径:   Com/Microsoft/Wa/Redmond

    例如:CN=test,OU=developer,DC=domainname,DC=com 在上面的代码中cn=test代表一个用户名,ou=developer代表一个active directory中的组织单位。 这句话的含义是test这个对象处在domainname.com域的developer组织单元中。

    二、LDAP的安装

    1.下载安装 openldap for windows,版本2.2.29.可以在百度上搜索openldap for windows。

            安装很简单,一路 next 即可,假设我们安装在C:Program FilesOpenLDAP 2.配置 openldap,编辑 slapd.conf 文件

    1)、打开C:Program FilesOpenLDAP slapd.conf,找到ucdata-path    ./ucdata include  ./schema/core.schema,在它后面添加 include  ./schema/cosine.schema include  ./schema/inetorgperson.schema

    接下来的例子只需要用到以上三个 schema,当然,如果你觉得需要的话,你可以把其他的 schema 全部添加进来

    include         ./schema/nis.schema

    include         ./schema/openldap.schema

    include         ./schema/dyngroup.schema

    include         ./schema/collective.schema

    include         ./schema/corba.schema

    include         ./schema/duaconf.schema

    include         ./schema/java.schema

    include         ./schema/misc.schema

    include         ./schema/pmi.schema

    include         ./schema/ppolicy.schema

    2)、下面我们做一个示例:      需要在 slapd.conf 配置文件中,找到      suffix  “dc=my-domain,dc=com”      rootdn  “cn=Manager,dc=my-domain,dc=com”     把这两行改为     suffix     "dc=mycompany,dc=com"

        rootdn   "cn=Manager,dc=mycompany,dc=com"
    suffix 就是看自己如何定义了,后面步骤的 ldif 文件就必须与它定义了。还要注意到这个配置文件中有一个 rootpw  secret,这个 secret 是cn=Manager 的密码,以后会用到,不过这里是明文密码,你可以用命令:slappasswd -h {MD5} -s secret  (“secret“是自定义的密码,可以随便设置)算出加密的密码{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==替换配置中的 secret。

    3. 启动 OpenLDAP     CMD 进入到C:Program FilesOpenLDAP 下, 1)、启动OpenLDAP-slapd服务:作用在于开机自动启动该服务项     slapd install OpenLDAP-slapd “OpenLDAP Directory Service” auto net start OpenLDAP-slapd NOTE: the “slapd install” is only needed if you didn’t choose the “create NTservice” option during installation.

    当你完成这一步后,下次开机的时候就自动启动LDAP的服务了,不必再次手动启动。(此步也可以忽略不做!) 2)、启 动OpenLDAP服务器 在cmd下运行:slapd -d 1

    启动成功可以看到控制台下打印一片信息,如下图

    openldap 默认是用的 Berkeley DB 数据库存储目录数据的。

    4. 建立条目,编辑导入 ldif 文件1) 新建一个 ldif(LDAP Data Interchanged Format) 文件(纯文本格式),例如 setup.ldif.

    setup.ldif 文件内容如下:

    1. <span style="font-family: Arial;">dn: dc=mycompany,dc=com 
    2. objectClass: top 
    3. objectClass: dcObject 
    4. objectClass: domain 
    5. dc: mycompany 
    6.  
    7. dn: ou=roles,dc=mycompany,dc=com 
    8. objectClass: top 
    9. objectClass: organizationalUnit 
    10. ou: roles 
    11.  
    12. dn: ou=people,dc=mycompany,dc=com 
    13. objectClass: top 
    14. objectClass: organizationalUnit 
    15. ou: people 
    16.  
    17. dn: cn=Test Users,ou=roles,dc=mycompany,dc=com 
    18. objectClass: groupOfUniqueNames 
    19. cn: Test Users 
    20. uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com 
    21. uniqueMember: uid=jbloggs,ou=people,dc=mycompany,dc=com 
    22.  
    23. dn: cn=Special Users,ou=roles,dc=mycompany,dc=com 
    24. objectClass: groupOfUniqueNames 
    25. cn: Special Users 
    26. uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com 
    27.  
    28. dn: cn=Admin Users,ou=roles,dc=mycompany,dc=com 
    29. objectClass: groupOfUniqueNames 
    30. cn: Admin Users 
    31. uniqueMember: uid=admin,ou=people,dc=mycompany,dc=com 
    32.  
    33. dn: uid=admin,ou=people,dc=mycompany,dc=com 
    34. objectClass: person 
    35. objectClass: inetOrgPerson 
    36. cn: State App 
    37. displayName: App Admin 
    38. givenName: App 
    39. mail: admin@fake.org 
    40. sn: Admin 
    41. uid: admin 
    42. userPassword: adminpassword 
    43.  
    44. dn: uid=jbloggs,ou=people,dc=mycompany,dc=com 
    45. objectClass: person 
    46. objectClass: inetOrgPerson 
    47. cn: Joe Bloggs 
    48. displayName: Joe Bloggs 
    49. givenName: Joe 
    50. mail: jbloggs@fake.org 
    51. sn: Bloggs 
    52. uid: jbloggs 
    53. userPassword: password 
    54.  
    55. dn: uid=sspecial,ou=people,dc=mycompany,dc=com 
    56. objectClass: person 
    57. objectClass: inetOrgPerson 
    58. cn: Super Special 
    59. displayName: Super Special 
    60. givenName: Super 
    61. mail: sspecial@fake.org 
    62. sn: Special 
    63. uid: sspecial 
    64. userPassword: password</span> 
    dn: dc=mycompany,dc=com
    objectClass: top
    objectClass: dcObject
    objectClass: domain
    dc: mycompany
    
    dn: ou=roles,dc=mycompany,dc=com
    objectClass: top
    objectClass: organizationalUnit
    ou: roles
    
    dn: ou=people,dc=mycompany,dc=com
    objectClass: top
    objectClass: organizationalUnit
    ou: people
    
    dn: cn=Test Users,ou=roles,dc=mycompany,dc=com
    objectClass: groupOfUniqueNames
    cn: Test Users
    uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
    uniqueMember: uid=jbloggs,ou=people,dc=mycompany,dc=com
    
    dn: cn=Special Users,ou=roles,dc=mycompany,dc=com
    objectClass: groupOfUniqueNames
    cn: Special Users
    uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
    
    dn: cn=Admin Users,ou=roles,dc=mycompany,dc=com
    objectClass: groupOfUniqueNames
    cn: Admin Users
    uniqueMember: uid=admin,ou=people,dc=mycompany,dc=com
    
    dn: uid=admin,ou=people,dc=mycompany,dc=com
    objectClass: person
    objectClass: inetOrgPerson
    cn: State App
    displayName: App Admin
    givenName: App
    mail: admin@fake.org
    sn: Admin
    uid: admin
    userPassword: adminpassword
    
    dn: uid=jbloggs,ou=people,dc=mycompany,dc=com
    objectClass: person
    objectClass: inetOrgPerson
    cn: Joe Bloggs
    displayName: Joe Bloggs
    givenName: Joe
    mail: jbloggs@fake.org
    sn: Bloggs
    uid: jbloggs
    userPassword: password
    
    dn: uid=sspecial,ou=people,dc=mycompany,dc=com
    objectClass: person
    objectClass: inetOrgPerson
    cn: Super Special
    displayName: Super Special
    givenName: Super
    mail: sspecial@fake.org
    sn: Special
    uid: sspecial
    userPassword: password

    2) 执行命令:ldapadd -x -D“cn=manager,dc=mycompany,dc=com” -w secret -f setup.ldif

    注意: ldapadd 命令使用的前提是必须装过oracle数据库。我之前没装,会提示ldapadd是不可执行的命令,总之就是系统不认识这个命令。后来装了oracle之后就可以用了。

    以上图示表示你已经将上述内容导入到LDAP数据库了。

    5. LdapBrowser 浏览 可点击链接 http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar下载。解压并双击lbe.bat批处理文件,弹出LDAP Browser窗口中默认会有一个OpenLdap_Localhost的链接,选edit

    弹出下面的对话框,输入你的主机名:注意:如果是localhost 就不行。原因在哪里我也不很矛盾。输入你在slapd.conf文件中的DN,和密码。

    SAVE—>>>Connect—>>>

    连接成功之后看到的结构图:

    6. Java 连接 openldap进行测试是否连接成功

    1. <span style="font-family: Arial;">package com.pccw.cms.test; 
    2. import java.util.Hashtable; 
    3. import javax.naming.Context; 
    4. import javax.naming.NamingException; 
    5. import javax.naming.directory.DirContext; 
    6. import javax.naming.directory.InitialDirContext; 
    7.  
    8. publicclass LDAPTest {    
    9.       public LDAPTest() {    
    10.       }    
    11.          
    12.      @SuppressWarnings("unchecked"
    13.     publicstaticvoid main(String[] args) {    
    14.  
    15.        String root = "dc=mycompany,dc=com"; //root    
    16.        
    17.         @SuppressWarnings("rawtypes"
    18.         Hashtable env = new Hashtable();    
    19.        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");    
    20.        env.put(Context.PROVIDER_URL, "ldap://192.168.3.51/" + root);       
    21.       env.put(Context.SECURITY_AUTHENTICATION, "simple");    
    22.        env.put(Context.SECURITY_PRINCIPAL, "cn=manager,dc=mycompany,dc=com");    
    23.         env.put(Context.SECURITY_CREDENTIALS, "secret");    
    24.        DirContext ctx = null;    
    25.        try {    
    26.         ctx = new InitialDirContext(env);    
    27.         System.out.println("认证成功");    
    28.        }    
    29.        catch (javax.naming.AuthenticationException e) {    
    30.          e.printStackTrace();    
    31.           System.out.println("认证失败");    
    32.         }    
    33.        catch (Exception e) {    
    34.          System.out.println("认证出错:");    
    35.         e.printStackTrace();    
    36.        }    
    37.         
    38.        if (ctx != null) {    
    39.          try {    
    40.             ctx.close();    
    41.          }    
    42.           catch (NamingException e) {    
    43.            //ignore    
    44.          }    
    45.         }    
    46.         System.exit(0);    
    47.      }           
    48.     }  </span> 
    package com.pccw.cms.test;
    import java.util.Hashtable;
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    
    public class LDAPTest {   
    	  public LDAPTest() {   
    	  }   
    	    
    	 @SuppressWarnings("unchecked")
    	public static void main(String[] args) {   
    
    	   String root = "dc=mycompany,dc=com"; //root   
    	  
    	    @SuppressWarnings("rawtypes")
    		Hashtable env = new Hashtable();   
    	   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");   
    	   env.put(Context.PROVIDER_URL, "ldap://192.168.3.51/" + root);      
    	  env.put(Context.SECURITY_AUTHENTICATION, "simple");   
    	   env.put(Context.SECURITY_PRINCIPAL, "cn=manager,dc=mycompany,dc=com");   
    	    env.put(Context.SECURITY_CREDENTIALS, "secret");   
    	   DirContext ctx = null;   
    	   try {   
    	    ctx = new InitialDirContext(env);   
    	    System.out.println("认证成功");   
    	   }   
    	   catch (javax.naming.AuthenticationException e) {   
    	     e.printStackTrace();   
    	      System.out.println("认证失败");   
    	    }   
    	   catch (Exception e) {   
    	     System.out.println("认证出错:");   
    	    e.printStackTrace();   
    	   }   
    	   
    	   if (ctx != null) {   
    	     try {   
    	        ctx.close();   
    	     }   
    	      catch (NamingException e) {   
    	       //ignore   
    	     }   
    	    }   
    	    System.exit(0);   
    	 }   	    
    	}  
    

    7.启动OpenLDAP服务的批处理

    新建一个文本文档,在文档写入一下内容:

    @echo off

    color 07

    echo 正在启动HZCA-LDAP文件,请稍等........

    cd  /d C:Program FilesOpenLDAP

    slapd -d 1

    color 07

    echo 启动失败!请重新启动OpenLDAP-slapd程序!输入启动指令:

    slapd -d 1

    echo.& pause

    将文档保存为autoStart.bat 那么当你点击它是,就启动LDAP的服务了!(若你已经在前面将LDAP的服务设定为开机自动启动,那就不需要再次启动这个服务。)

    好了,关于LDAP的基本配置就讲到这里。接下来的第二篇文章会讲述如何将LDAP与Tomcat整合配置,进行权限访问。

  • 相关阅读:
    SpringMVC中web.xml中url配置路径 / 和 /* 的区别
    spring mvc @RequestMapping method 不写的话,默认GET、POST都支持,根据前端方式自动适应
    MyBatis项目所引用的一切依赖jar包和自定义设置
    Python 代码性能优化技巧
    linux basic commands
    linuxx virutal machine installation
    安装 Django
    virtualenv (isolated virtual environment) for python runtime
    夜间模式的开启与关闭,父模板的制作
    完成登录与注册页面的前端
  • 原文地址:https://www.cnblogs.com/gracian/p/3578900.html
Copyright © 2020-2023  润新知