1. 程式人生 > >java實現LDAP目錄登陸驗證

java實現LDAP目錄登陸驗證

(2-2009至6-2009)要做一套對專案開發、跟蹤、管理、多伺服器同步備份的系統整合。主要結合svn、apache、tomcat、bugzilla、sendmail、openSSL、LDAP這些開源優秀軟體在ubuntu下實現。其中涉及到JAVA EE的WEB開發,EMAIL、NDS應用模組的配置和結合,資料加密,專案管理過程設計,SVN資料的備份與恢復等等。而我和幾個teammates主要負責開發一個web應用程式,對svn中各個庫的使用者許可權進行詳細管理。

Linux下這些軟體的結合是由一位Linux高手用了兩個月時間,一步一步的配置起來,間中遇到的各種各樣問題,在大家的努力下,終於把整個系統搭建起來。

因為公司原來就已經組建了一個非常完善的LDAP目錄庫,LDAP目錄庫,就像一個通訊錄,裡面已經存放了所以公司人員的基本資訊(如姓名,郵箱,職位等等)。這裡有一個前提:所有的公司員工作為使用者都可以登入這個web應用程式,登入後,系統則再根據那些SVN庫對於這個使用者是否有開放訪問許可權,如果有,則展現給使用者。所以我們可以充分利用這個LDAP目錄庫,非常方便的管理這個WEB應用程式的使用使用者。

現在不談整個驗證過程,就談談登入時,如何匹配LDAP目錄庫的資訊,從而通過登入驗證。匹配LDAP目錄庫記錄時,要求要提供以下資訊:LDAP目錄庫地址,基準DN,個人的CN,登入密碼。如下面的一個例子:

LDAP目錄庫地址ldap://10.67.10.2:3268/
基準DN: DC=corp,DC=sb
個人的CN: CN=Xiaopeng Deng,OU=HR,DC=CN,DC=corp,DC=sb
登入密碼: 123456

sAMAccountName是個人的CN結點中的一個屬性,例如上述的個人的CN的sAMAccountName的值為:xdeng。我命名它為shortname,即短名。在外國非常流行於使用shortname作為個人在公司中的稱號,包括用於各種系統的登入。現在這個web應用程式也要使用這個sAMAccountName作為登入名登入。查了JAVA操作LDAP庫的包,解決方法還是有的:

1,使用者提供了sAMAccountName和密碼,想登入系統。

2,首先要使用一個已知個人的CN及其密碼,登入到LDAP目錄庫。登入成功後,這裡會返回一個LDAP上下文類:InitialLdapContext。

3,利用這個上下文類中的方法:SearchControls,可以根據搜尋條件字串返回一個列舉類:NamingEnumeration,這時的搜尋條件就可以指定sAMAccountName的值為使用者輸入的shortname。

4,如果搜尋返回的列舉類中有值,則可以從這個物件中獲取得它的 CN值。沒有,則說明不存在這個使用者

5,再根據這個CN值,和使用者提供的密碼,進行LDAP目錄庫的登入驗證匹配過程。

目的其實非常單純:先用一個已知的CN及其密碼通過LDAP目錄庫驗證,然後就可以查詢到使用者提供的shortname的對應CN是什麼,最後就利用這個CN和使用者提供的密碼驗證。最重要就是獲得使用者shortname的對應CN!

具體的類程式碼分享出來:(其中部分經過了我老大的修改後,更加完善,老大厲害!)

使用單態模式

程式碼中的bindDN,bindPassword變數值就是首先知道的CN及其密碼,值放在資原始檔中。

[java] view plaincopyprint?
  1. import java.io.File; 
  2. import java.io.FileInputStream; 
  3. import java.io.IOException; 
  4. import java.net.URL; 
  5. import java.util.Hashtable; 
  6. import java.util.Properties; 
  7. import javax.naming.Context; 
  8. import javax.naming.NameClassPair; 
  9. import javax.naming.NamingEnumeration; 
  10. import javax.naming.NamingException; 
  11. import javax.naming.directory.DirContext; 
  12. import javax.naming.directory.InitialDirContext; 
  13. import javax.naming.directory.SearchControls; 
  14. import javax.naming.ldap.Control; 
  15. import javax.naming.ldap.InitialLdapContext; 
  16. import javax.naming.ldap.LdapContext; 
  17. import javax.naming.ldap.SortControl; 
  18. import org.apache.commons.logging.Log; 
  19. import org.apache.commons.logging.LogFactory; 
  20. import com.util.Constant; 
  21. /**
  22. * LDAP Connector seems like JDBC, supposed to interface with AD.
  23. *
  24. * Use singleton pattern to prevent multi-instances.
  25. *
  26. */
  27. publicclass LDAPConnector { 
  28.     /** Logger for this class and subclasses */
  29.     protectedfinal Log log = LogFactory.getLog(getClass()); 
  30.     privatestatic LDAPConnector instance; 
  31.     private String url; 
  32.     private String baseDN; 
  33.     private String bindDN; 
  34.     private String bindPassword; 
  35.     privatefinal Hashtable<String, String> env =new Hashtable<String, String>(); 
  36.     privatefinal Control[] sortConnCtls =new SortControl[1]; 
  37.     { 
  38.         try
  39.             sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL); 
  40.         } catch (IOException ex) { 
  41.         } 
  42.     } 
  43.     private LDAPConnector() { 
  44.         try
  45.             URL fileUrl = getClass().getClassLoader().getResource(Constant.FILE_LDAP_CONFIG); 
  46.             File resource = new File(fileUrl.getFile()); 
  47.             Properties properties = new Properties(); 
  48.             properties.load(new FileInputStream(resource)); 
  49.             url = properties.getProperty("url"); 
  50.             baseDN = properties.getProperty("baseDN"); 
  51.             bindDN = properties.getProperty("bindDN"); 
  52.             bindPassword = properties.getProperty("bindPassword"); 
  53.             // set up environment for creating initial context
  54.             env.put(Context.PROVIDER_URL, url + baseDN); 
  55.             env.put(Context.SECURITY_PRINCIPAL, bindDN); 
  56.             env.put(Context.SECURITY_CREDENTIALS, bindPassword); 
  57.             env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
  58.             env.put("java.naming.batchsize","50"); 
  59.             env.put("com.sun.jndi.ldap.connect.timeout","3000"); 
  60.             env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  61.             env.put("com.sun.jndi.ldap.connect.pool","true"); 
  62.             // the following pool parameters doesn't work
  63.             // must setup as java init parameters
  64.             env.put("com.sun.jndi.ldap.connect.pool.maxsize","3"); 
  65.             env.put("com.sun.jndi.ldap.connect.pool.prefsize","1"); 
  66.             env.put("com.sun.jndi.ldap.connect.pool.timeout","300000"); 
  67.             env.put("com.sun.jndi.ldap.connect.pool.initsize","1"); 
  68.             env.put("com.sun.jndi.ldap.connect.pool.authentication","simple"); 
  69.         } catch (Exception e) { 
  70.             // ignore error
  71.             e.printStackTrace(); 
  72.         } 
  73.     } 
  74.     publicstatic LDAPConnector getInstance() { 
  75.         if (instance == null
  76.             instance = new LDAPConnector(); 
  77.         return instance; 
  78.     } 
  79.     publicboolean validateUser(String username, String password) { 
  80.         boolean passed =false
  81.         LdapContext dirContext = null
  82.         try
  83.             // create initial context
  84.             dirContext = new InitialLdapContext(env, sortConnCtls); 
  85.             dirContext.setRequestControls(sortConnCtls); 
  86.             SearchControls controls = new SearchControls(); 
  87.             controls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
  88.             String filter = "(sAMAccountName=" + username +")"
  89.             NamingEnumeration<?> answer = dirContext.search("", filter, controls); 
  90.             String userDN = null
  91.             while (answer.hasMore()) { 
  92.                 userDN = ((NameClassPair) answer.nextElement()).getName(); 
  93.             } 
  94.             // set up environment for creating initial context
  95.             Hashtable<String, String> env = new Hashtable<String, String>(); 
  96.             env.put(Context.PROVIDER_URL, url + baseDN); 
  97.             env.put(Context.SECURITY_PRINCIPAL, userDN + "," + baseDN); 
  98.             env.put(Context.SECURITY_CREDENTIALS, password); 
  99.             env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
  100.             env.put("com.sun.jndi.ldap.connect.timeout","1000"); 
  101.             env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  102.             // create initial context
  103.             DirContext context = new InitialDirContext(env); 
  104.             passed = true
  105.             context.close(); 
  106.         } catch (NamingException e) { 
  107.             // ignore error
  108.             // e.printStackTrace();
  109.         } finally
  110.             if (dirContext != null) { 
  111.                 try
  112.                     dirContext.close(); 
  113.                 } catch (NamingException e) { 
  114.                     e.printStackTrace(); 
  115.                 } 
  116.             } 
  117.         } 
  118.         return passed; 
  119.     } 

相關推薦

java實現LDAP目錄登陸驗證

(2-2009至6-2009)要做一套對專案開發、跟蹤、管理、多伺服器同步備份的系統整合。主要結合svn、apache、tomcat、bugzilla、sendmail、openSSL、LDAP這些開源優秀軟體在ubuntu下實現。其中涉及到JAVA EE的WEB開發,EM

簡單的JAVA實現連線資料庫並且驗證登陸

package three; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.

Java實現表單登陸驗證

Java實現登陸及驗證 前端程式碼 前端程式碼只是一個表單隨意就好具體樣式看個人愛好 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"&

JAVA實現LDAP連線驗證

什麼是LDAP? LDAP(輕量目錄訪問協議),簡單的說,LDAP是一個能得到關於人或者資源的集合、靜態資料的快速方式。 這種說法似乎有點抽象,結合這幾天在做的一個專案具體來談一下。 AD,LDAP,初來乍到的面對這些在課本上不可能碰到的新術語還真是有些懵了,查了大

Java實現系統目錄實時監聽更新。

warning xtend absolute ava single sdn data- sdk spl SDK1.7新增的nio WatchService能完美解決這個問題。美中不足是如果部署在window系統下會出現莫名其妙的文件夾占用異常導致子目錄監聽失效

Java實現郵箱發送驗證

int res intern 服務 char ati aging err con 第一步,導入JAR包,JAR包下載地址[http://pan.baidu.com/s/1kVRvGyF] 正式代碼:   首先書寫一個工具類:   MailUtil import

java實現手機短信驗證全過程

stp 文章 tst write ktr 數據類型 import .get 模板 手機短信驗證現在在各種系統可以說都是用的非常普遍的,這個可能是方便和安全性的考慮,所以才廣泛的使用,這篇文章就以一個短信接口的實例,來講解一下怎麽使用短信接口。 一、前期工作 首先,我們需要選

使用SpringMVC攔截器實現簡單的登陸驗證功能(面向小白)

接著上一篇文章《使用Idea建立一個JavaWeb的SSM(maven)專案實現登陸功能》 在上一篇文章裡已經實現了頁面登陸的功能,但是不夠完善,在沒有攔截器的情況下我可以不登陸一樣可以訪問index.jsp頁面 如圖 在這種情況下專案是有風險的,別人可以在不登陸的情況下隨意訪問你的

java實現一個簡單的驗證碼生成器

  最近看了網上很多大佬們寫的驗證碼生成,尋思著自己也寫一個,話不多說,程式碼如下:                                &

Java實現註冊郵箱啟用驗證

Java實現註冊郵箱啟用驗證 置頂 2013年12月26日 18:05:07 kenhins 閱讀數:25706 標籤: 郵箱 郵件 java hashmap 加密 更多 個人分類: Java web 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.

Java實現有效時間簡訊驗證

上週由於其他的工作繁忙,都沒時間來寫部落格,這不一有時間,就馬上來寫最近實現的性功能了。 這篇主要講的是怎麼讓簡訊驗證碼具有時效性,我手上的專案要求的時效性是5分鐘,那麼話不多說,我就開始碼程式碼了~這裡主要還用到了第三方的簡訊介面,互億無線簡訊平臺。www.i

java實現登入視窗(含驗證驗證、賬戶註冊等)

登入視窗主類 package ccnu.paint; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.Point; impo

java實現詳細的身份證驗證、能正確驗證身份證正確性

IdCardExpUtil.java package com.javazs.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import

Java實現通過smtp伺服器驗證郵箱的真實有效性

要用到commons-net-3.3.jar、dnsjava-2.1.7.jar包 大部分的國內常見郵箱都能準確驗證。 驗證頻率和數量多的話容易被封掉ip package com.tieniu; import java.io.IOException; import o

java實現註冊的簡訊驗證

第三方簡訊介面服務商—動力思維樂信,贈送100條免費測試簡訊。 步驟一、到http://www.lx598.com/ 註冊一個賬號,這個賬號和密碼後期接入過程中要用到。 步驟二、登入賬戶,完善企業資訊,申請sdk使用。   步驟三、閱讀“簡訊介面api”文件,和下載對於開發

SpringBoot + thymeleaf 實現簡單的登陸驗證

本文上一篇的內容的基礎上,加入thymeleaf 模板,實現一個簡單的登陸和頁面錯誤提示的功能,藉此瞭解SpringBoot web專案,同時為大家分享一些編碼小技巧,用於簡化程式碼。 我們回到第一篇的內容,看一下專案的目錄結構,SpringBoot 生成專案

java實現登入頁面的驗證碼功能

我們訪問電商網站,登入賬號時。都需要驗證碼的輸入。那麼在java中,我們是如何實現驗證碼的呢?這裡,我用servelet做個demo。 程式碼清單: package com.test; import java.awt.Color; import java.

Java實現檔案目錄的遍歷

import java.io.File; import java.io.IOException; public class FileUtil { //遍歷某目錄下的所有目錄 public st

java實現手機郵箱格式驗證

JAVA實現手機郵箱格式驗證 詳細程式碼 import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Aut

java實現檔案目錄壓縮

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip