好了,有了前一个例子,对spring ldap有了简单的了解,下面我将一步一步加以说明,来完成上面那个例子。

首先你本地应该有LDAP环境,利用我上一篇文章里附带的安装包和配置文件安装配置完毕即可,我刚刚又检查了一遍,根据我上一篇文章附带的安装说明,搭建LDAP环境应该是没有问题的 。

除了这些,你还要多LDAP的schema要有所了解,知道它是做什么的,如何更改他们来符合自己的需求等,这里我推荐一篇文章,因为我也对schema一知半解,仅仅停留在会使用的层面上,不敢误导人,看看这篇文章吧:http://jimmyleeee.blog.163.com/blog/static/9309618200971123940563/

下面我通过程序向ldap添加一个部门,前提是已经按照上一篇文章创建好了目录,不管你有没有跑通我上一篇文章中的例子,至少目录应该建立好了,下面所说的都基于这个目录结构来说的

java ldaps 连接配置 spring ldap_spring ldap

首先到你LDAP安装目录下找到这个文件,我的路径是:C:\Program Files (x86)\OpenLDAP\schema\core.schema

我们是要添加部门,那么首先要看看部门定义允许存入哪些属性,我的如下

objectclass ( 2.5.6.5 NAME 'organizationalUnit'
    DESC 'RFC2256: an organizational unit'
    SUP top STRUCTURAL
    MUST ou
    MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $
        x121Address $ registeredAddress $ destinationIndicator $
        preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
        telephoneNumber $ internationaliSDNNumber $
        facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
        postalAddress $ physicalDeliveryOfficeName $ st $ l $ description $ sslvpn $ incontroller $ deptcode ) )

这个你的不一定和我的会一样,我的修改过了,我这里就用默认的属性操作,你可以不用动自己的,默认就行。

下面编写程序来添加部门

首先是要连接到LDAP,所以,跟使用JDBC一样,要有连接地址、用户名、密码、以及LDAP要求的DN值,其实这些你已经在配置LDAP 的时候看到过了,

java ldaps 连接配置 spring ldap_LDAP_02

我们项目中的这个XML文件com.study.ou.ldap-ou.xml的配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
        <property name="url"  value="ldap://192.168.0.108:389"/><!--这个就是连接地址了,LDAP默认端口是389-->
        <property name="base" value="dc=itrus,dc=com,dc=cn"/><!--这个就是baseDN了-->
        <property name="userDn" value="cn=Manager,dc=itrus,dc=com,dc=cn" /><!--这个是用户DN-->
        <property name="password" value="secret"/><!--密码-->
    </bean>
<!--下面这些你应该认识了,不用我多说了吧-->
    <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
        <constructor-arg ref="contextSource"/>
    </bean>
    <bean id="ldapContext" class="com.study.dao.impl.OuDAOImpl">
        <property name="ldapTemplate" ref="ldapTemplate"/>
    
    </bean>
</beans>

接下来我们在程序里面需要定义一个DAO,看到上面的配置文件,我想这个你应该可以想到了吧

package com.study.dao;

import java.util.Map;

public interface OuDAO {
    /**
     * 根据DN值插入单位
     * @param map
     * @param supDn
     */
    public void insertOu(Map<String,String> map,String supDn);
}

然后实现这个接口

package com.study.dao.impl;

import java.util.Map;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;

import org.springframework.ldap.core.DistinguishedName;
import org.springframework.ldap.core.LdapTemplate;

import com.study.dao.OuDAO;

public class OuDAOImpl implements OuDAO {
    LdapTemplate ldapTemplate;
    public void setLdapTemplate(LdapTemplate ldapTemplate){
        this.ldapTemplate=ldapTemplate;
    }
    @Override
    public void insertOu(Map<String, String> map, String supDn) {
        Attributes ouAttributes=new BasicAttributes();//创建一个dn的属性集,
        BasicAttribute ouBasicAttribute=new BasicAttribute("objectclass");
        ouBasicAttribute.add("organizationalUnit");//声明自己要添加的类型是objectclass=organizationalUnit的,这样就对应了我上面贴出来的core.schema
        ouAttributes.put(ouBasicAttribute);
        for(String str:map.keySet()){//从map中循环遍历拿出属性和属性值放入属性集中
            ouAttributes.put(str,map.get(str));
        }
        DistinguishedName newContactDN=new DistinguishedName(supDn);//这里的参数supDn是说自己的上一级节点是谁,这个方法中我们传入的是"",没有上一级
        newContactDN.add("ou",map.get("ou"));//显示在树中的值
        ldapTemplate.bind(newContactDN,null,ouAttributes);//执行添加,这个方法在被添加的节点已存在的情况下会抛异常

    }

}

package com.study.ou;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import com.study.dao.OuDAO;


@SuppressWarnings("deprecation")
public class EngerOu {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
  //构建一个map,键是core.schema中organizationalUnit下必选属性+任意的可选属性,ou是organizationalUnit的必选属性        map.put("deptCode", "a01");
        map.put("ou", "软件部");
        map.put("description", "这是一个部门节点");
        map.put("postalAddress", "正常"); 
        new EngerOu().testMethod(map, "");//传入map和父节点
    }
    public void testMethod(Map<String,String> map,String supDn){
        Resource resource=new ClassPathResource("com/study/ou/ldap-ou.xml");
        BeanFactory factory=new XmlBeanFactory(resource);
        OuDAO ldapContact=(OuDAO) factory.getBean("ldapContext");
        ldapContact.insertOu(map, supDn);
    }
}

执行后会向ldap添加一条ou记录,ou是对部门简称。

java ldaps 连接配置 spring ldap_spring_03

这样就完成了添加部门的操作。

大致的操作也就这样啦,下一篇将介绍人员的添加,其实和部门的添加也很相似。

 

================================================

PS:

  1、最重要的是对LDAP要有点了解,要知道它的表现形式。

  2、在用程序操作之前要明白为什么会选用LDAP,要看LDAP的一些百科

  3、了解LDAP的可以无压力了,我的文章只适合小白看了,我自己也是个小白。