`
jin8000608172
  • 浏览: 140188 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

LDAP工具类

阅读更多
package com.xxxpiao.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;


@SuppressWarnings("restriction")
public class LdapHelper {
	
	 private static DirContext dirContext;
	 
	 public static Logger logger = LoggerFactory.getLogger(LdapHelper.class);
	 
	 	/**
	 	 * 默认账号连接LDAP服务器
	 	 * @return
	 	 */
	 	@SuppressWarnings(value = "unchecked")
	    public static DirContext getDirContext() {
	        String account = "cn=xxxadmin,ou=authusers,dc=2caipiao,dc=com"; //binddn 
	        String password = "Yae0zohV2mieJooCho";    //bindpwd
	        String root = "dc=2caipiao,dc=com"; // root
	        Hashtable env = new Hashtable();
	        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	        env.put(Context.PROVIDER_URL, "ldap://192.168.90.144:389/" + root);
	        env.put(Context.SECURITY_AUTHENTICATION, "simple");
	        env.put(Context.SECURITY_PRINCIPAL, account);
	        env.put(Context.SECURITY_CREDENTIALS, password);
	        try {
	            // 链接ldap
	        	dirContext = new InitialDirContext(env);
	        	logger.info("认证成功!");
	        } catch (javax.naming.AuthenticationException e) {
	        	logger.error("认证失败:"+e.toString());
	        } catch (Exception e) {
	        	logger.error("认证失败:"+e.toString());
	        }
	        return dirContext;
	    }
	 	/**
	 	 * 
	 	 * @param ldapAccount 连接LDAP服务器账号
	 	 * @param ldapPassword 连接LDAP服务器密码
	 	 * @param ldapRoot LDAP服务器根目录
	 	 * @param ldapServerIP LDAP服务器IP
	 	 * @return
	 	 */
	 	@SuppressWarnings(value = "unchecked")
	 	public static DirContext getDirContext(String ldapAccount,String ldapPassword,String ldapRoot,String ldapServerIP) {
	 		Hashtable env = new Hashtable();
	 		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	 		env.put(Context.PROVIDER_URL, "ldap://"+ldapServerIP+":389/" + ldapRoot);
	 		env.put(Context.SECURITY_AUTHENTICATION, "simple");
	 		env.put(Context.SECURITY_PRINCIPAL, ldapAccount);
	 		env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
	 		try {
	 			// 链接ldap
	 			dirContext = new InitialDirContext(env);
	 			logger.info("认证成功!");
	 		} catch (javax.naming.AuthenticationException e) {
	 			logger.error("认证失败:"+e.toString());
	 		} catch (Exception e) {
	 			logger.error("认证失败:"+e.toString());
	 		}
	 		return dirContext;
	 	}
	    /**
	     * 关闭LDAP连接
	     */
	    public static void closeDirCountext(){
	        try {
	        	if(dirContext!=null){
	        		dirContext.close();
	        	}
	        } catch (NamingException ex) {
	        	logger.error(ex.toString());
	        }
	    }
	    /**
	     * 验证密码的是否一致
	     * @param ldapPassword 从LDAP服务器获取的密码
	     * @param inputPassword 用户输入的密码
	     * @return
	     * @throws NoSuchAlgorithmException
	     */
	    @SuppressWarnings(value = "unchecked")
	    public static boolean verifySHA(String ldapPassword, String inputPassword)
	            throws NoSuchAlgorithmException {

	        // MessageDigest 提供了消息摘要算法,如 MD5 或 SHA,的功能,这里LDAP使用的是SHA-1
	        MessageDigest md = MessageDigest.getInstance("SHA-1");

	        // 取出加密字符
	        if (ldapPassword.startsWith("{SSHA}")) {
	            ldapPassword = ldapPassword.substring(6);
	        } else if (ldapPassword.startsWith("{SHA}")) {
	            ldapPassword = ldapPassword.substring(5);
	        }

	        // 解码BASE64
	        byte[] ldappwbyte = Base64.decode(ldapPassword);
	        byte[] shacode;
	        byte[] salt;

	        // 前20位是SHA-1加密段,20位后是最初加密时的随机明文
	        if (ldappwbyte.length <= 20) {
	            shacode = ldappwbyte;
	            salt = new byte[0];
	        } else {
	            shacode = new byte[20];
	            salt = new byte[ldappwbyte.length - 20];
	            System.arraycopy(ldappwbyte, 0, shacode, 0, 20);
	            System.arraycopy(ldappwbyte, 20, salt, 0, salt.length);
	        }

	        // 把用户输入的密码添加到摘要计算信息
	        md.update(inputPassword.getBytes());
	        // 把随机明文添加到摘要计算信息
	        md.update(salt);

	        // 按SSHA把当前用户密码进行计算
	        byte[] inputpwbyte = md.digest();

	        // 返回校验结果
	        return MessageDigest.isEqual(shacode, inputpwbyte);
	    }
	    /**
	     * 验证用户名密码
	     * @param ldapAccount 连接LDAP服务器账号
	     * @param ldapPassword 连接LDAP服务器密码
	     * @param ldapRoot LDAP服务器根目录
	     * @param ldapServerIP LDAP服务器IP
	     * @param account 用户账号
	     * @param password 用户密码
	     * @return
	     */
	    public static boolean authenticate(String ldapAccount,String ldapPassword,String ldapRoot,String ldapServerIP,String account, String password) {
	        boolean success = false;
	        DirContext dirContext = null;
	        try {
	        	dirContext = LdapHelper.getDirContext(ldapAccount, ldapPassword, ldapRoot, ldapServerIP);
	            SearchControls constraints = new SearchControls();
	            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
	            NamingEnumeration en = dirContext.search("", "cn=" + account, constraints); // 查询所有用户
	            while (en != null && en.hasMoreElements()) {
	                Object obj = en.nextElement();
	                if (obj instanceof SearchResult) {
	                    SearchResult si = (SearchResult) obj;
	                    logger.info("name:"+si.getName());
	                    Attributes attrs = si.getAttributes();
	                    if (attrs == null) {
	                        System.out.println("No   attributes");
	                    } else {
	                        Attribute attr = attrs.get("userPassword");
	                        Object o = attr.get();
	                        byte[] s = (byte[]) o;
	                        String passwordFromLdap = new String(s);
	                        success = LdapHelper.verifySHA(passwordFromLdap, password);
	                        return success;
	                    }
	                } else {
	                	logger.info(obj.toString());
	                }
	            }
	            dirContext.close();
	        } catch (NoSuchAlgorithmException ex) {
	            try {
	                if (dirContext != null) {
	                	dirContext.close();
	                }
	            } catch (NamingException namingException) {
	            	logger.error(namingException.toString());
	            }
	            logger.error(ex.toString());
	        } catch (NamingException ex) {
	            try {
	                if (dirContext != null) {
	                	dirContext.close();
	                }
	            } catch (NamingException namingException) {
	                logger.error(namingException.toString());
	            }
	            logger.error(ex.toString());
	        }
	        return false;
	    }
	   /**
	    * 验证用户名密码(走默认的LDAP账号)
	    * @param account 用户名
	    * @param password 用户密码
	    * @return
	    */
	    public static boolean authenticate(String account, String password) {
	    	boolean success = false;
	    	DirContext dirContext = null;
	    	try {
	    		dirContext = LdapHelper.getDirContext();
	    		SearchControls constraints = new SearchControls();
	    		constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
	    		NamingEnumeration en = dirContext.search("", "cn=" + account, constraints); // 查询所有用户
	    		while (en != null && en.hasMoreElements()) {
	    			Object obj = en.nextElement();
	    			if (obj instanceof SearchResult) {
	    				SearchResult si = (SearchResult) obj;
	    				logger.info("name:"+si.getName());
	    				Attributes attrs = si.getAttributes();
	    				if (attrs == null) {
	    					System.out.println("No   attributes");
	    				} else {
	    					Attribute attr = attrs.get("userPassword");
	    					Object o = attr.get();
	    					byte[] s = (byte[]) o;
	    					String ldapPassword = new String(s);
	    					success = LdapHelper.verifySHA(ldapPassword, password);
	    					return success;
	    				}
	    			} else {
	    				logger.info(obj.toString());
	    			}
	    		}
	    		dirContext.close();
	    	} catch (NoSuchAlgorithmException ex) {
	    		try {
	    			if (dirContext != null) {
	    				dirContext.close();
	    			}
	    		} catch (NamingException namingException) {
	    			logger.error(namingException.toString());
	    		}
	    		logger.error(ex.toString());
	    	} catch (NamingException ex) {
	    		try {
	    			if (dirContext != null) {
	    				dirContext.close();
	    			}
	    		} catch (NamingException namingException) {
	    			logger.error(namingException.toString());
	    		}
	    		logger.error(ex.toString());
	    	}
	    	return false;
	    }
	    
	    public static void main(String[] args) {
	    	System.out.println(authenticate("congmin.jin", "00"));
			System.out.println(authenticate("cn=xxxadmin,ou=authusers,dc=2caipiao,dc=com", "Yae0zohV2mieJooCho", "dc=2caipiao,dc=com", "192.168.90.144", "congmin.jin", "11"));
		}
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    什么是LDAP连接工具?如何利用好它.docx

    1. **目录结构探索**:使用 LDAP 连接工具,可以清晰地查看 LDAP 目录结构,理解不同对象类和属性的组织方式。 2. **数据管理**:编辑和创建 LDAP 条目,更新用户信息,管理组成员关系等。 3. **权限设置**:配置 ...

    LDAPUtil.java

    为在java中整合ldap写的工具类。 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息...

    ldap常用类封装下载

    1. **LDAPHelper.java**:这是一个实用工具类,通常包含各种静态方法,用于执行常见的LDAP操作,如添加、删除、修改和查找条目。它可能提供了简化的方法,以处理复杂的LDAP操作,如构建过滤器,执行搜索,或连接到...

    ldapadmin,windows下管理ldap的工具

    **LDAPadmin:Windows环境下的LDAP管理工具** 在IT领域,LDAP(Lightweight Directory Access Protocol)是一种广泛用于存储和检索用户信息、配置数据等目录服务的数据访问协议。它为分布式网络提供了一个标准的...

    封装JNDI的LDAP服务器的工具类

    LdapOperUtils 是 LDAP 操作工具类,包含了各种对 LDAP 目录进行查询、修改、添加、删除等操作的方法。这些方法通常会使用上文创建的 DirContext 对象进行实际的 JNDI 调用。例如,可能有一个 `search` 方法用于...

    ldapbrowser,LDAP连接工具

    `ldapbrowser`作为一个IBM类工具,可能意味着它具有与IBM系统或服务集成的能力,或者是IBM推荐的用于管理其LDAP部署的第三方工具。 **Java与LDAP浏览器** 由于`ldapbrowser`被提及为“类似jar包打开工具”,我们...

    LDAP用户管理工具 下载

    1. **目录浏览**:允许用户查看整个LDAP目录结构,包括各个节点(如OU - 组织单元)、对象类和属性。 2. **对象创建与编辑**:支持创建新的用户、组或其他对象,并修改现有对象的属性,如用户名、密码、邮件地址等...

    Ldap文件读取工具(Java)

    JXplorer是一款开源的、跨平台的LDAP和LDIF文件查看和编辑工具,它允许用户直观地浏览、创建和修改LDAP目录。对于开发和测试LDAP应用程序,这样的工具非常有用,因为它提供了一个图形化的界面来查看数据和执行操作,...

    LDAP工具集成

    验证用户身份是LDAP工具的重要组成部分。C#中,可以通过`DirectorySearcher`类进行搜索操作,使用过滤器(如"(&(objectClass=user)(sAMAccountName=))”来查找特定用户,然后比较提供的密码与用户账户的密码哈希值,...

    ldap连接测试工具源代码C#版

    标题 "ldap连接测试工具源代码C#版" 涉及到的是一个使用C#编程语言开发的 LDAP(轻量级目录访问协议)连接测试工具。这个工具的主要功能是允许用户进行域用户信息的读取、域结构的探索以及登录验证。在Windows环境下...

    LDAP的工具openDJ

    在安装和配置OpenDJ时,你需要创建一个目录结构,定义对象类和属性,然后导入数据。这通常涉及以下步骤: 1. **安装服务器**:下载并安装OpenDJ软件包,根据指南配置服务器的基本设置。 2. **创建数据存储**:定义...

    LDAP客户端免安装

    这类工具通常具有以下功能: 1. **连接与搜索**:LdapAdmin允许用户连接到 LDAP 服务器,输入服务器地址、端口、用户名和密码等信息,然后执行搜索操作来查找目录中的条目。用户可以根据特定的过滤条件来查找所需的...

    ApacheDirectoryStudio LDAP ide工具

    3. Schema编辑器:用户可以通过Schema编辑器来定义和管理LDAP目录的结构,包括对象类、属性类型、命名规则等,以满足特定需求。 4. LDAP连接配置:用户可以轻松设置和保存多个LDAP服务器连接,以便快速切换和测试...

    Laravel开发-ldap-auth

    Laravel 4.x版本提供了一个强大的工具集,使得开发者能够轻松集成像LDAP这样的企业级身份验证系统,特别是对于那些依赖Active Directory(AD)或NTLM(NT LAN Manager)进行用户管理的组织。 ### LDAP简介 LDAP是一...

    ldap6配置文档

    4. **导入初始数据**:可以使用LDAP的工具(如`ldapadd`命令)将用户数据导入到LDAP目录中。 5. **启用TLS/SSL**:对于安全性要求较高的场景,可以通过配置TLS/SSL来加密客户端与服务器之间的通信。 #### 客户端...

    spring-ldap1.3.1

    - `LdapTemplate`:这是Spring LDAP的核心类,提供了一种模板方法模式来执行各种LDAP操作。它封装了连接管理、查询构建和结果处理,使开发者能够专注于业务逻辑而不是底层细节。 - `DirContextOperations`:这是...

    spring_ldap

    - **org.springframework.ldap.transaction.compensating.support**:提供了支持补偿事务处理的基础工具类。 - **org.springframework.ldap.ldif**:此包关注于 LDIF(LDAP 数据交换格式)相关的功能。 - **org....

    ldaptest:使用 JDK LDAP 类的 LDAP 测试工具

    A simple LDAP connection checker - by Tom Fonteyne Usage: java -jar ldaptest.jar -u &lt;url&gt; -b &lt;baseDN&gt; -f &lt;filter&gt; [-a attr1[,attr2]] [-D binddn -w password] [-rf|-ri|-rt] [-t [-n]]" Required:" -u ...

    spring ldap的使用

    `LdapTemplate`是Spring LDAP的核心组件之一,它充当了一个高级的LDAP操作工具类。`LdapTemplate`提供了多种方法来执行常见的LDAP操作,如搜索、插入、修改和删除条目。它还负责处理LDAP连接和事务管理,使得开发...

    封装jndi操作ldap服务器的工具类

    使用者只需了解如何操作List和Map,即可利用这些工具类进行LDAP操作,例如: ```java Env env = new Env("com.sun.jndi.ldap.LdapCtxFactory", "ldap://server.example.com:389", "admin", "password"); ...

Global site tag (gtag.js) - Google Analytics