本文主要參考官方文檔:http://www.openldap.org/doc/admin24/quickstart.html
和網(wǎng)上流傳的教程:
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 下載后點(diǎn)擊安裝即可。
配置sldap.conf :在安裝目錄下找到sldap.conf ,修改配置如下:
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw secret
啟動(dòng)OpenLDAP:進(jìn)入cmd命令行,跳轉(zhuǎn)到OpenLDAP安裝目錄下,運(yùn)行:
slapd -d 1
用可以看到控制臺(tái)下打印一片信息,openldap 默認(rèn)是用的 Berkeley DB 數(shù)據(jù)庫(kù)存儲(chǔ)目錄數(shù)據(jù)的。
再開(kāi)一個(gè)cmd,跳轉(zhuǎn)到OpenLDAP安裝目錄下。
測(cè)試OpenLDAP是否正常啟動(dòng):
ldapsearch -x -s base (objectclass=*) namingContexts
官方文檔里,這一條命令加了些單引號(hào),但帶單引號(hào)的命令在Windows環(huán)境下跑不通。后面的命令也都避免
使用引號(hào)。
如果返回:
dn:
namingContexts: dc=example,dc=com
則說(shuō)明OpenLDAP成功啟動(dòng)
增加一個(gè)條目:
1.做一個(gè)LDIF文件
2.使用ldapadd命令
1.在安裝目錄下,新建文件example.ldif,輸入如下內(nèi)容:
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
注意:在文檔每一行的開(kāi)頭和結(jié)尾不要有空格,文檔最后最好也別回車。建議不要拷貝,用手敲這幾行。
2.cmd在安裝目錄下,運(yùn)行:
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f example.ldif
可能會(huì)要求輸入密碼:secret (配置文件里寫(xiě)的這個(gè)密碼)
添加條目成功后,會(huì)有提示: adding new entry cn=Manager,dc=example,dc=com
簡(jiǎn)單查詢:
ldapsearch -x -b dc=example,dc=com (objectclass=*)

查詢成功后,會(huì)返回剛才插入的條目。
JNDI連接OpenLDAP
Java的JNDI接口很強(qiáng)大,可以連接LDAP服務(wù)。
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( "認(rèn)證成功" );
}
catch (javax.naming.AuthenticationException e) {
e.printStackTrace();
System.out.println( "認(rèn)證失敗" );
}
catch (Exception e) {
System.out.println( "認(rèn)證出錯(cuò):" );
e.printStackTrace();
}if (ctx != null ) {
try {
ctx.close();
}
catch (NamingException e) {
//ignore
}
}
}
}
問(wèn)題:
1. 圖形化界面LDAPBrowser的配置
下載地址:
http://files.blogjava.net/Unmi/LdapBrowser282.rar
解壓后進(jìn)入LdapBrowser282目錄,打開(kāi)配置文件OpenLdap_Localhost.cfg
修改配置:
basedn=dc=example,dc=com
managerdn=cn=Manager,dc=example,dc=com
運(yùn)行l(wèi)be.bat進(jìn)入圖形界面后選擇連接OpenLdap_Localhost即可。
2. OpenLDAP的語(yǔ)法,內(nèi)置ObjectClass
LDAP學(xué)習(xí)
entry(record,directory object) 條目 一條數(shù)據(jù) 相當(dāng)于數(shù)據(jù)表的一條記錄
entry由若干個(gè)attribute組成,objectclass是必須的attribute,用于描述entry的schema
attribute是name/value對(duì)形式,例如cn = liuxuanyu cn = mengke 一個(gè)name 可以對(duì)應(yīng)多個(gè)值
container是一種特殊的entry,為數(shù)據(jù)的組織和管理提供一個(gè)繼承體系結(jié)構(gòu),例如ou
任何entry都可以在特定的情況下變成container
與關(guān)系數(shù)據(jù)庫(kù)的比較:
LDAP讀操作性能高,寫(xiě)操作性能不如DB,DB 讀寫(xiě)均可,讀操作性能不如LDAP
數(shù)據(jù)結(jié)構(gòu)不同
LDAP適合于存儲(chǔ)繼承結(jié)構(gòu)的數(shù)據(jù)
namespace
DN (distinguish name) DN是entry的名字,entry的唯一標(biāo)識(shí)
RDN (relative distinguish name) entry在某個(gè)容器范圍內(nèi)的標(biāo)識(shí)
CN (common name) 常用名稱 習(xí)慣上被用作RDN
DC (domain component) 域名
LDAP只允許樹(shù)形結(jié)構(gòu)
object identifier (OID) 例如:2.5.4.3 它是屬性類型的標(biāo)識(shí)符
schema
object class 定義了entry的類型
有三種類型的object Class: 抽象類、輔助類和結(jié)構(gòu)化類。
構(gòu)造schema的方式 :
1. 組合現(xiàn)有的object class
2. 擴(kuò)展現(xiàn)有的object class 繼承 使用輔助類(實(shí)際上是一種聚合關(guān)系)
The subschema publishes the schema to clients
inetOrgPerson is a contemporary definition for a person entry RFC 2798
3. JLDAP與JNDI的比較
JLDAP是由novel開(kāi)發(fā)的,原是針對(duì)Novel的NDS目錄設(shè)計(jì)的JAVA訪問(wèn)工具。NOVEL的NDS和網(wǎng)景(NETSCAPE)的目錄是工具界最早的目錄產(chǎn)品。JLDAP并非JNDI的服務(wù)供應(yīng)者,而是同一抽象層次下的訪問(wèn)工具集。與JNDI-LDAP相比,JLDAP更接近于類關(guān)系數(shù)據(jù)庫(kù)的訪問(wèn)方式。
NDS是遵守LDAP協(xié)議的并進(jìn)行了擴(kuò)展的類MAD產(chǎn)品。而NOVEL也已把JLDAP捐獻(xiàn)給了OPENLDAP開(kāi)源項(xiàng)目,可以世界范圍內(nèi)自由使用。與 JNDI相比,JLDAP無(wú)須繼承DirContext才能實(shí)現(xiàn)添加,也無(wú)需預(yù)先生成添加的類,可以象普通數(shù)據(jù)訪問(wèn)那樣,生成連接,然后使用::add方法添加。這樣,添加的靈活性要強(qiáng)于JNDI。
但由于JLDAP目前是訪問(wèn)NDS,因此,它不具備JNDI完全面向?qū)ο蟠鎯?chǔ)的能力,對(duì)于高級(jí)的LDAP應(yīng)用,JLDAP不是合適的選擇。
4. OpenLDAP的深入管理