本文主要參考官方文檔:http://www.openldap.org/doc/admin24/quickstart.html
和網上流傳的教程:
http://www.lifv.cn/?p=462
OpenLDAP下載地址:
http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe 下載后點擊安裝即可。
配置sldap.conf :在安裝目錄下找到sldap.conf ,修改配置如下:
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw secret
啟動OpenLDAP:進入cmd命令行,跳轉到OpenLDAP安裝目錄下,運行:
slapd -d 1
用可以看到控制臺下打印一片信息,openldap 默認是用的 Berkeley DB 數據庫存儲目錄數據的。
再開一個cmd,跳轉到OpenLDAP安裝目錄下。
測試OpenLDAP是否正常啟動:
ldapsearch -x -s base (objectclass=*) namingContexts
官方文檔里,這一條命令加了些單引號,但帶單引號的命令在Windows環境下跑不通。后面的命令也都避免
使用引號。
如果返回:
dn:
namingContexts: dc=example,dc=com
則說明OpenLDAP成功啟動
增加一個條目:
1.做一個LDIF文件
2.使用ldapadd命令
1.在安裝目錄下,新建文件example.ldif,輸入如下內容:
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: example

dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager
注意:在文檔每一行的開頭和結尾不要有空格,文檔最后最好也別回車。建議不要拷貝,用手敲這幾行。
2.cmd在安裝目錄下,運行:
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f example.ldif
可能會要求輸入密碼:secret (配置文件里寫的這個密碼)
添加條目成功后,會有提示: adding new entry cn=Manager,dc=example,dc=com
簡單查詢:
ldapsearch -x -b dc=example,dc=com (objectclass=*)

查詢成功后,會返回剛才插入的條目。
JNDI連接OpenLDAP
Java的JNDI接口很強大,可以連接LDAP服務。
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class TestOpenLDAP {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestOpenLDAP LDAPTest1 = new TestOpenLDAP();
String root = "dc=example,dc=com"; //root
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
env.put(Context.SECURITY_AUTHENTICATION, "simple" );
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=example,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
}
}
}
}
問題:
1. 圖形化界面LDAPBrowser的配置
下載地址:
http://files.blogjava.net/Unmi/LdapBrowser282.rar
解壓后進入LdapBrowser282目錄,打開配置文件OpenLdap_Localhost.cfg
修改配置:
basedn=dc=example,dc=com
managerdn=cn=Manager,dc=example,dc=com
運行lbe.bat進入圖形界面后選擇連接OpenLdap_Localhost即可。
2. OpenLDAP的語法,內置ObjectClass
LDAP學習
entry(record,directory object) 條目 一條數據 相當于數據表的一條記錄
entry由若干個attribute組成,objectclass是必須的attribute,用于描述entry的schema
attribute是name/value對形式,例如cn = liuxuanyu cn = mengke 一個name 可以對應多個值
container是一種特殊的entry,為數據的組織和管理提供一個繼承體系結構,例如ou
任何entry都可以在特定的情況下變成container
與關系數據庫的比較:
LDAP讀操作性能高,寫操作性能不如DB,DB 讀寫均可,讀操作性能不如LDAP
數據結構不同
LDAP適合于存儲繼承結構的數據
namespace
DN (distinguish name) DN是entry的名字,entry的唯一標識
RDN (relative distinguish name) entry在某個容器范圍內的標識
CN (common name) 常用名稱 習慣上被用作RDN
DC (domain component) 域名
LDAP只允許樹形結構
object identifier (OID) 例如:2.5.4.3 它是屬性類型的標識符
schema
object class 定義了entry的類型
有三種類型的object Class: 抽象類、輔助類和結構化類。
構造schema的方式 :
1. 組合現有的object class
2. 擴展現有的object class 繼承 使用輔助類(實際上是一種聚合關系)
The subschema publishes the schema to clients
inetOrgPerson is a contemporary definition for a person entry RFC 2798
3. JLDAP與JNDI的比較
JLDAP是由novel開發的,原是針對Novel的NDS目錄設計的JAVA訪問工具。NOVEL的NDS和網景(NETSCAPE)的目錄是工具界最早的目錄產品。JLDAP并非JNDI的服務供應者,而是同一抽象層次下的訪問工具集。與JNDI-LDAP相比,JLDAP更接近于類關系數據庫的訪問方式。
NDS是遵守LDAP協議的并進行了擴展的類MAD產品。而NOVEL也已把JLDAP捐獻給了OPENLDAP開源項目,可以世界范圍內自由使用。與 JNDI相比,JLDAP無須繼承DirContext才能實現添加,也無需預先生成添加的類,可以象普通數據訪問那樣,生成連接,然后使用::add方法添加。這樣,添加的靈活性要強于JNDI。
但由于JLDAP目前是訪問NDS,因此,它不具備JNDI完全面向對象存儲的能力,對于高級的LDAP應用,JLDAP不是合適的選擇。
4. OpenLDAP的深入管理