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?- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.net.URL;
- import java.util.Hashtable;
- import java.util.Properties;
- import javax.naming.Context;
- import javax.naming.NameClassPair;
- import javax.naming.NamingEnumeration;
- import javax.naming.NamingException;
- import javax.naming.directory.DirContext;
- import javax.naming.directory.InitialDirContext;
- import javax.naming.directory.SearchControls;
- import javax.naming.ldap.Control;
- import javax.naming.ldap.InitialLdapContext;
- import javax.naming.ldap.LdapContext;
- import javax.naming.ldap.SortControl;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import com.util.Constant;
- /**
- * LDAP Connector seems like JDBC, supposed to interface with AD.
- *
- * Use singleton pattern to prevent multi-instances.
- *
- */
- publicclass LDAPConnector {
- /** Logger for this class and subclasses */
- protectedfinal Log log = LogFactory.getLog(getClass());
- privatestatic LDAPConnector instance;
- private String url;
- private String baseDN;
- private String bindDN;
- private String bindPassword;
- privatefinal Hashtable<String, String> env =new Hashtable<String, String>();
- privatefinal Control[] sortConnCtls =new SortControl[1];
- {
- try {
- sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL);
- } catch (IOException ex) {
- }
- }
- private LDAPConnector() {
- try {
- URL fileUrl = getClass().getClassLoader().getResource(Constant.FILE_LDAP_CONFIG);
- File resource = new File(fileUrl.getFile());
- Properties properties = new Properties();
- properties.load(new FileInputStream(resource));
- url = properties.getProperty("url");
- baseDN = properties.getProperty("baseDN");
- bindDN = properties.getProperty("bindDN");
- bindPassword = properties.getProperty("bindPassword");
- // set up environment for creating initial context
- env.put(Context.PROVIDER_URL, url + baseDN);
- env.put(Context.SECURITY_PRINCIPAL, bindDN);
- env.put(Context.SECURITY_CREDENTIALS, bindPassword);
- env.put(Context.SECURITY_AUTHENTICATION, "simple");
- env.put("java.naming.batchsize","50");
- env.put("com.sun.jndi.ldap.connect.timeout","3000");
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- env.put("com.sun.jndi.ldap.connect.pool","true");
- // the following pool parameters doesn't work
- // must setup as java init parameters
- env.put("com.sun.jndi.ldap.connect.pool.maxsize","3");
- env.put("com.sun.jndi.ldap.connect.pool.prefsize","1");
- env.put("com.sun.jndi.ldap.connect.pool.timeout","300000");
- env.put("com.sun.jndi.ldap.connect.pool.initsize","1");
- env.put("com.sun.jndi.ldap.connect.pool.authentication","simple");
- } catch (Exception e) {
- // ignore error
- e.printStackTrace();
- }
- }
- publicstatic LDAPConnector getInstance() {
- if (instance == null)
- instance = new LDAPConnector();
- return instance;
- }
- publicboolean validateUser(String username, String password) {
- boolean passed =false;
- LdapContext dirContext = null;
- try {
- // create initial context
- dirContext = new InitialLdapContext(env, sortConnCtls);
- dirContext.setRequestControls(sortConnCtls);
- SearchControls controls = new SearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- String filter = "(sAMAccountName=" + username +")";
- NamingEnumeration<?> answer = dirContext.search("", filter, controls);
- String userDN = null;
- while (answer.hasMore()) {
- userDN = ((NameClassPair) answer.nextElement()).getName();
- }
- // set up environment for creating initial context
- Hashtable<String, String> env = new Hashtable<String, String>();
- env.put(Context.PROVIDER_URL, url + baseDN);
- env.put(Context.SECURITY_PRINCIPAL, userDN + "," + baseDN);
- env.put(Context.SECURITY_CREDENTIALS, password);
- env.put(Context.SECURITY_AUTHENTICATION, "simple");
- env.put("com.sun.jndi.ldap.connect.timeout","1000");
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- // create initial context
- DirContext context = new InitialDirContext(env);
- passed = true;
- context.close();
- } catch (NamingException e) {
- // ignore error
- // e.printStackTrace();
- } finally {
- if (dirContext != null) {
- try {
- dirContext.close();
- } catch (NamingException e) {
- e.printStackTrace();
- }
- }
- }
- return passed;
- }
- }
相關推薦
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