五一閒來沒事,加上項目正在進行UAT。抽空研究了一下LDAP相關知識。隨手作一個記錄。php
爲了方便閱讀仍是先介紹一下什麼是LDAP?html
The Lightweight Directory Access Protocol , orLDAP ,is an application protocol for querying and modifying directory services running over TCP/IP .(via wikipedia)。LDAP全稱是一個輕量級的目錄訪問協議,它是創建在TCP/IP基礎之上的用來查詢和修改目錄服務的。這是照着wiki翻譯的,可是有人要問了什麼是directory Service(目錄服務)?java
按照wiki的說法的話講:在軟件行業,目錄就如同一個字典,他使得經過某一名稱去查找綁定在該名稱上的值得方式成爲一種可能。有點相似Java中Map的概念。adirectory service is simply the software system that stores, organizes and provides access to information in a directory. 一個目錄服務就是一個簡單的軟件系統,在這個目錄上提供了存取和組織信息的功能。LDAP目錄中能夠存儲各類類型的數據:電子郵件地址、郵件路由信息、人力資源數據、公用密匙、聯繫人列表,等等。windows
OK,進入正題。Google搜索 windows ldap服務器,終於找到了一個比較好的流行的:OpenLDAP(點擊下載)。api
安裝仍是比較簡單的,一直next就好。服務器
這裏記得把上面2個都選上,將LDAP註冊爲系統的一個服務,默認安裝位置:C:\Program Files\OpenLDAP,app
進入安裝目錄,編輯slapd.conf文件:編輯器
找到ide
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格式的數據了。
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: paradise.lsj@gmail.com
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命令會提示但不會停止。
可能你們看了這麼多感受仍是很抽象,咱們須要一個GUI看看LDAP究竟是個什麼東東。
這裏推薦兩個瀏覽工具
這是個Java 開發的 LDAP Browser/Editor 工具,不但跨平臺(Windows, Unix-like),並且功能很是完整,速度又快。運行起來的界面時這個樣子的。
這是一個比較強大和專業的客戶端,涵蓋了大多數企業的LDAP服務類型。
一直下一步安裝成功後,它的配置也是比較簡單的:
新建一個profile,命名爲Local_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)