標籤:
五一閑來沒事,加上項目進行中UAT。抽空研究了一下LDAP相關知識。隨手做一個記錄。
為了方便閱讀還是先介紹一下什麼是LDAP?
前言、Lightweight Directory Access Protocol:
The Lightweight Directory Access Protocol , or LDAP ,is an application protocol for querying and modifying directory services running over TCP/IP .(via wikipedia )。LDAP全稱是一個輕量級的目錄訪問協議,它是建立在TCP/IP基礎之上的用來查詢和修改目錄服務的。這是照著wiki翻譯的,但是有人要問了什麼是directory Service(目錄服務)?
按照wiki的說法的話講:在軟體行業,目錄就如同一個字典,他使得通過某一名稱去尋找綁定在該名稱上的值得方式成為一種可能。有點類似Java中Map的概念。a directory service is simply the software system that stores, organizes and provides access to information in a directory. 一個目錄服務就是一個簡單的軟體系統,在這個目錄上提供了存取和組織資訊的功能。LDAP目錄中可以儲存各種類型的資料:電子郵件地址、郵件路由資訊、人力資源資料、公用密匙、連絡人清單,等等。
OK,進入正題。Google搜尋 windows ldap伺服器,終於找到了一個比較好的流行的:OpenLDAP(點擊下載)。
一、OpenLDAP安裝和配置
安裝還是比較簡單的,一直next就好。
這裡記得把上面2個都選上,將LDAP註冊為系統的一個服務,預設安裝位置:C:\Program Files\OpenLDAP,
進入安裝目錄,編輯slapd.conf檔案:
找到
ucdata-path ./ucdata
include ./schema/core.schema
在下面加入:(注意你的系統路徑,可能隨安裝位置不同而稍有差異)
include ./schema/core.schema (這裡是和原來有的,如果加入的話就重複包含了,不能正常啟動了。應該除這句外都加入)
include ./schema/corba.schema
include ./schema/dyngroup.schema
include ./schema/java.schema
include ./schema/misc.schema
include ./schema/cosine.schema
include ./schema/nis.schema
include ./schema/inetorgperson.schema
include ./schema/openldap.schema
這個搞定以後,在同一檔案後面的(大概65-66行,修改)
suffix ”o=anotherbug,c=com“ (直接拷貝過去引號會變成中文的。注意引號用英文的,會影響啟動)
rootdn ”cn=manager,o=anotherbug,c=com“
還有第70行的位置 : rootpw secret,這裡要修改為加密後的密碼。
具體操作:
開啟命令列,定位到安裝目錄下,輸入:slappasswd -h {MD5} –s “替換為你想要設定的密碼,無引號”
將產生的MD5密文:{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==填入原來secret位置。
OK至此配置已經搞定,可以測試一下服務了。開啟命令列轉到安裝目錄下輸入:sldapd -d 1 注意命令是(slapd -d 1)
至此LDAP伺服器已經搭建並可以跑起來了.下面要來測試怎麼倒入.ldif格式的資料了。 二、
建立條目(Entry) ,匯入 ldif 尾碼名檔案
ldif:LDAP Data Interchange Format,基於文本。有兩種類型的 LDIF 檔案:第一種是描述 Directory 條目資料的,第二種是描述更新條目的。我們主要看怎麼描述條目的。
開啟編輯器(如Editplus,UltraEdit等),建立test.ldif內容如下:
dn: o=anotherbug,c=com
objectClass: dcObject
objectClass: organization
o: anotherbug
dc: com
dn: uid=mousepoato, o=anotherbug,c=com
uid: mousepoato
objectClass: inetOrgPerson
mail: [email protected]
userPassword: admin
labeledURI: http://anotherbug.com/blog
sn: Li
cn: test
注意ldif檔案對格式的要求非常嚴格,屬性要以冒號和空格與值隔開,並且其他地方不允許有空格。否則當你匯入ldif檔案時,會提示出現“ldap_add: Invalid syntax (21)”等諸多錯誤,另外在我機器上測試,ldif對中文支援也還不好,比如我將最後的cn: test改為 cn: 滑鼠馬鈴薯,匯入就會報錯。
寫完儲存到安裝目錄下。在命令列輸入:
ldapadd -c -x -D “cn=manager,o=anotherbug,c=com” -w “剛才替換secret出的密碼明文” -f test.ldif
運行命令後結果如下:
注意我們在ldapadd後面加上了 ”–c “ 參數,他會一直運行不會因錯誤而終止,比如對系統已經存在的entry命令會提示但不會中止。 三、LDAP查看工具
可能大家看了這麼多感覺還是很抽象,我們需要一個GUI看看LDAP到底是個什麼東東。
這裡推薦兩個瀏覽工具
1、LdapBrowser
這是個Java 開發的 LDAP Browser/Editor 工具,不但跨平台(Windows, Unix-like),而且功能非常完整,速度又快。運行起來的介面時這個樣子的。
2、Softrra LDAP Administrator 2009
這是一個比較強大和專業的用戶端,涵蓋了大多數企業的LDAP服務類型。
一直下一步安裝成功後,它的配置也是比較簡單的:
建立一個profile,命名為Local_LDAP
配置串連資訊
這是完整配置好後的效果
四、通過 JNDI api操作LDAP例子
Javax裡面提供的JNDI為我們封裝好了對LDAP 的directory service進行存取查詢的函數,可以方便實用。
貼上我用JUnit4寫一個對LADP伺服器進行測試的代碼供參考:
private static Logger log = Logger.getLogger(TestLdapOper.class);
DirContext context = null;
TestLdap tldap = null;
@Before
public void init() throws NamingException {
tldap = new TestLdap();
context = tldap.getContext();// 擷取context
}
@Test
@Ignore
public void testInsert() throws NamingException {
tldap.addEntry(context, “uid=IBM,o=anotherbug,c=com”);
}
@SuppressWarnings(“unchecked”)
@Test
public void testGetAttributes() throws NamingException {
List attNameList = new ArrayList();
attNameList.add(“o”);
attNameList.add(“dc”);
attNameList.add(“objectClass”);
Map map = JNDIUitl.getAttributes(context, “o=anotherbug,c=com”, attNameList);
Iterator keyValuePairs = map.entrySet().iterator();
for (int i = 0; i < map.size(); i++) {
Map.Entry entry = (Map.Entry) keyValuePairs.next();
Object key = entry.getKey();
Object value = entry.getValue();
log.info(key + “==key”);
log.info(value + “–value”);
}
}
@SuppressWarnings(“unchecked”)
@Test
public void testGetAttriValues() throws NamingException {
assertEquals(“anotherbug.com”, JNDIUitl.getAttributeValues(context, “o=anotherbug,c=com”, “dc”).get(0) + “”);
List lst = new ArrayList();
lst = JNDIUitl.getAttributeValues(context, “o=anotherbug,c=com”, “objectClass”);
assertEquals(“organization”, lst.get(1) + “”);
for (int i = 0; i < lst.size(); i++) {
log.info(lst.get(i));
log.info(ReflectionToStringBuilder.toString(lst.get(i)).toString());
}
}
@SuppressWarnings(“unchecked”)
@Test
public void testSearchContext() throws NamingException {
List list = JNDIUitl.searchContextSub(context, “o=anotherbug,c=com”, “(objectClass=*)”);
for (int i = 0; i < list.size(); i++) {
log.info(list.get(i));
}
}
@After
public void destroy() throws NamingException {
context.close();
}
補充
另外一款LDAP軟體 LDAP Admin Tool Professional
官方地址:http://www.ldapsoft.com/index.html
C# 到LDAP 驗證的代碼
在我的空間檔案夾裡放著呢(本站的SkyDrive)
http://cid-0a71bbfb566de45c.skydrive.live.com/self.aspx/%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%b1%bb%e6%96%87%e4%bb%b6%e5%a4%b9/ldap4%5E_blog.rar
Windows 下搭建LDAP伺服器