`

LDAP验证登录及获取单个用户信息

 
阅读更多
import java.io.BufferedInputStream;
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStream;
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.Attributes;
import javax.naming.directory.DirContext;  
import javax.naming.directory.InitialDirContext;  
import javax.naming.directory.SearchControls;  
import javax.naming.directory.SearchResult;
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.phicomm.vo.User;
  
//import com.util.Constant;  
  
/** 
 * LDAP Connector seems like JDBC, supposed to interface with AD. 
 *  
 * Use singleton pattern to prevent multi-instances. 
 *  
 */  
public class LDAPConnector {  
    private static LDAPConnector instance;  
    private String url;  
    private String baseDN;  
    private String bindDN;  
    private String bindPassword;  
    private final Hashtable<String, String> env = new Hashtable<String, String>();  
    private final Control[] sortConnCtls = new SortControl[1];  
  
    {  
        try {  
            sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL);  
        } catch (IOException ex) {  
        }  
    }  
  
    private LDAPConnector() {  
        try {  
            InputStream in =  LDAPConnector.class.getClassLoader().getResourceAsStream("ldap.properties");
            Properties properties = new Properties();  
            properties.load(in);  
            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();  
        }  
    }  
  
    public static LDAPConnector getInstance() {  
        if (instance == null)  
            instance = new LDAPConnector();  
        return instance;  
    }  
    //验证用户
    public boolean 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.hasMoreElements()) {  
            	//获得用户DN
                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;  
    }  
    //获得用户信息
    public User getUser(String username){
    	LdapContext dirContext = null; 
    	User user = 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);  
	        while (answer.hasMoreElements()) {  
	        	user = new User();
	        	//获得用户信息
	        	SearchResult sr = (SearchResult) answer.nextElement();
	        	Attributes Attrs = sr.getAttributes();
	        	user.setName(username);
	        	String truename = Attrs.get("name")+"";
	        	user.setTruename(truename.substring(truename.indexOf(":")).trim());
	        	String mail = Attrs.get("mail")+"";
	        	user.setEmail(mail.substring(mail.indexOf(":")).trim());
	        }  
    	 } catch (NamingException e) {  
             // ignore error  
              //e.printStackTrace();  
         } finally {  
             if (dirContext != null) {  
                 try {  
                     dirContext.close();  
                 } catch (NamingException e) {  
                     e.printStackTrace();  
                 }  
             }  
         }
         return user;
    }
    
}  

 配置文件ldap.properties:

url=ldap://127.0.0.1:389/
baseDN = DC=networks,DC=com
bindDN = cloudadmin02
bindPassword =########

 

 

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...

    java jdk-api-1.6 中文 chmd

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...

    java api最新7.0

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...

    JDK_1_6 API

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...

    JavaAPI1.6中文chm文档 part1

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...

    JavaAPI中文chm文档 part2

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...

    [Java参考文档]

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...

    [Java参考文档].JDK_API 1.6

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...

    Java 1.6 API 中文 New

    java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...

Global site tag (gtag.js) - Google Analytics