LDAP:(輕量級目錄訪問協議,Lightweight Directory Access Protocol)它是基於 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組織單元中。
OpenLDAP安裝及試用
現在市場上有關LDAP的產品已有很多,各大軟件公司都在他們的產品中集成了LDAP服務,如Microsoft的 ActiveDirectory、iPlanet的iPlanet Directory Server(現已更名為:Sun Java System Directory Server)、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服務。OpenLDAP則是LDAP的開源實現,它比商業產品一點也不差,而且源碼開放。
1. 下載安裝 openldap for windows,版本2.2.29
下載地址:http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
安裝很簡單,一路 next 即可,假設我們安裝在 D:\openldap
2. 配置 openldap, 編輯 slapd.conf 文件
1)、打開 D:\openldap\slapd.conf,找到ucdata-path ./ucdata
include ./schema/core.schema,在它后面添加
include ./schema/cosine.schema
include ./schema/inetorgperson.schema
2)、下面我們做一個示例:在中國(cn)的tt公司添加一個系統管理員sa.
需要在 slapd.conf 配置文件中,找到
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
把這兩行改為
suffix "o=tt,c=cn"
rootdn "cn=Manager,o=tt,c=cn"
suffix 就是看自己如何定義了,后面步驟的 ldif 文件就必須與它定義了。還要注意到這個配置文件中有一個 rootpw secret,這個 secret 是 cn=Manager 的密碼,以后會用到,不過這里是明文密碼,你可以用命令: slappasswd -h {MD5} -s mysecret (mysecret"是自定義的密碼,可以隨便設置)算出加密的密碼 {MD5}BsIZ5byDePOoo/g7S35GSQ== 替換配置中的 secret。
3. 啟動 OpenLDAP
CMD 進入到 D:\openldap 下,
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 NT service" option during installation.
2)、啟動OpenLDAP服務器
slapd -d 1
啟動成功可以看到控制台下打印一片信息,如下圖
openldap 默認是用的 Berkeley DB 數據庫存儲目錄數據的。
4. 建立條目,編輯導入 ldif 文件
1) 新建一個 ldif(LDAP Data Interchanged Format) 文件(純文本格式),例如 test.ldif,文件內容如下:
dn: o=tt,c=cn
objectClass: dcObject
objectClass: organization
o: tt
dc: com
dn: uid=sa, o=tt,c=cn
uid: sa
objectClass: inetOrgPerson
mail: xhy@nfschina.com
userPassword: intec
labeledURI: http://www.nfschina.com
sn: sa-sn
cn: sa-cn
2) 執行命令:ldapadd -x -D "cn=manager,o=tt,c=cn" -w mysecret -f test.ldif
參數含義可以運行 ldapadd /? 命令來查看,這樣我們已經成功導入組織tt和一個用戶-系統管理員(uid=sa)
導入成功,會如上圖所顯示。如果出現“ldap_bind: Invalid credentials (49)”這個錯誤,請檢查配置文件是否配置正確,執行的命令(ldapadd -x -D "cn=manager,o=tt,c=cn" -w mysecret -f test.ldif)是否正確,是不是-w后面所跟的密碼跟我們步驟2-2)所設置的不同等等,仔細檢查一下即可。 另外如果想刪除我們導入的數據,可以先ctrl+c終止OpenLDAP,然后運行net stop OpenLDAP-slapd停止服務,刪除data子文件夾下的內容即可。
5. LdapBrowser 瀏覽
可點擊鏈接 http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar 下載。解壓並雙擊lbe.bat批處理文件,彈出LDAP Browser窗口中默認會有一個OpenLdap_Localhost的鏈接,選edit,
點擊 Fetch DNs 按鈕會匹配出我們前面設置的DN,password那填寫我們步驟2-2)所設置的密碼mysecret,SAVE--->>>Connect--->>>我們會看到相關信息~~
6. Java 連接 openldap
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class test {
public static void main(String[] args) {
String root = "o=tt,c=cn" ; //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,o=tt,c=cn" );
env.put(Context.SECURITY_CREDENTIALS, "mysecret" );
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
}
}
}
}
資源:
http://www.openldap.org/ http://baike.baidu.com/view/159263.htm http://blog.chinaunix.net/u/13366/showart_130825.html - LDAP詳解
http://blog.chinaunix.net/u/21863/showart_141286.html http://fanqiang.chinaunix.net/app/ldap/2005-03-23/2979.shtml 擴展文獻:
http://docs.sun.com/source/816-4121/contents.htm http://technet.microsoft.com/zh-cn/library/cc782657%28WS.10%29.aspx Active Directory
轉自:http://hi.baidu.com/chinagenius/blog/item/28c92d037c7087e009fa9342.html