`

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连接和验证ldap文档

    Java 连接和验证 LDAP 文档 Java 连接和验证 LDAP 文档是一份关于 Java 语言连接和验证 LDAP 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...

    HackTheBox机器:分析,LDAP盲注入以获取凭据.zip

    如果控制器未正确验证或转义用户输入,那么就可能为攻击者提供机会进行LDAP注入。MVC模式下的应用程序应当确保所有外部输入都经过严格的过滤和验证,以防止这种类型的攻击。 **LDAP盲注入的检测与利用**: - **检测...

    LDAP 应用程序接口

    本文档旨在详细介绍LDAP API的基本概念、使用方法及相关操作步骤。 #### 二、LDAP模型概述 LDAP模型基于一种层次化的结构,其中每个节点被称为**条目**(Entry),每个条目由一组**属性**(Attribute)构成。这些...

    LDAP(轻型目录访问协议)

    4. **条目(Entry)**:包含在目录中的单个信息项,由一组属性组成。 5. **域名(Domain Component, dc)**:表示域名空间的一部分,通常用作LDAP目录的顶级容器。 #### 四、LDAP协议的发展历程 - **LDAP v1**:最初...

    Web应用中的ldap相关问题

    LDAP注入攻击类似于SQL注入攻击,其核心在于利用未经适当处理或验证的用户输入来构造恶意的LDAP查询语句,从而获取未授权的信息或执行非法操作。攻击者通常会在用户提交的数据中嵌入特殊字符或命令,以此操纵最终...

    LDAP2VCard:将 LDAP 数据转换为 VCard 文件的 Python 脚本

    2. **查询 LDAP 数据**:通过 LDAP 查询语句(如 LDAP Filter)获取需要的联系人信息。 3. **解析 LDAP 结果**:将查询结果转换为 Python 对象,便于进一步处理。 4. **创建 VCard 对象**:利用 `vobject` 库,为每...

    Shiro学习第一式身份验证2

    Realm实现了`AuthenticationInfo`接口,提供获取用户身份验证信息的方法。当用户尝试登录时,Shiro会向 Realm 提供用户名和密码,然后 Realm 会去查找并验证这些凭证。 3. **多个Realm**:在更复杂的应用中,可能...

    Weblogic使用YALE(耶鲁)CAS实现SSO单点登录 的方法.doc

    Yale CAS 是耶鲁大学开发的一种开源的单点登录(SSO)解决方案,提供了一个通用的身份验证框架,允许用户使用单个身份验证来访问多个应用程序。CAS 服务器充当着身份验证服务器的角色,负责验证用户的身份,生成 ...

    LDAP Utilities-开源

    1. **ldapsearch**: 这个工具允许用户查询LDAP服务器以获取特定信息。通过指定过滤条件和搜索基,可以定位到所需的条目。例如,查找所有属于某个组的用户或者具有特定属性的条目。 2. **ldapadd**: 此工具用于向...

    cve-2020-8840.zip

    这可能导致返回所有管理员用户的记录,而非预期的单个用户。 **漏洞影响** CVE-2020-8840对受感染系统的潜在影响非常严重,因为 LDAP 通常用于存储重要的认证信息,如用户名、密码哈希以及用户的角色和权限。一旦...

    cas单点登录

    CAS(Central Authentication Service)是基于Java的开源身份验证框架,主要功能是实现Web应用的单点登录(Single Sign-On,简称SSO)。SSO允许用户通过一次登录,就能访问多个相互信任的应用系统,无需在每个系统中...

    cas server

    CAS(Central Authentication Service)服务器是一种基于Java的开源身份验证协议,它允许用户通过单个登录(Single Sign-On,SSO)访问多个应用系统。CAS Server是这个协议的实现,为组织提供了一种集中式的身份验证...

    旗舰版堡垒机3.x快速入门1

    3.2.3. 提权登录堡垒机还支持提权登录功能,即在普通权限的基础上获取更高的系统权限。这在执行特定操作或管理任务时非常有用。在创建或编辑主机账号时,勾选“允许提权”选项,并填写提权用户名和密码,这样用户在...

    zApplicationSecurity:您将需要根据需要自定义此zVSE大型机CICS安全过程。 它与zVSE LDAP服务一起使用

    4. **认证与授权**:zApplicationSecurity通过集成LDAP服务实现用户身份验证,确保只有经过验证的用户才能登录和执行操作。 5. **审计和日志记录**:记录所有的系统活动,以便于追踪潜在的安全威胁和合规性检查。 ...

    openfiler使用手册

    - 设置用户配额有助于防止单个用户过度占用存储资源。 **5.3 Openfiler文件服务功能总结** - Openfiler提供了丰富的文件服务功能,包括但不限于SMB/CIFS、FTP、NFS等协议的支持,以及磁盘配额的管理。 #### 六、...

    spring_security2_2.0.5.zip

    5. **会话管理**:Spring Security也提供了会话管理功能,可以防止会话固定攻击,设置会话超时策略,并能控制单个用户登录的并发会话数量。 6. **密码加密**:为了增强安全性,Spring Security提供了密码加密机制。...

    将SHIRO作为应用的权限基础一:SHIRO的整体架构.pdf

    SecurityManager的配置是Shiro应用的关键部分,因为它连接到Realm以获取用户和权限信息。 3. **Realm**:Realm是Shiro与应用安全数据之间的桥梁,它对接各种安全数据源,如LDAP、JDBC数据库、INI配置或属性文件。 ...

    Windows 2000活动目录开发人员参考库 第3卷 ADSI程序员指南

    - **身份验证和授权**:编写脚本自动验证用户登录,或者根据用户角色分配权限。 - **系统管理**:自动化用户账户的创建、修改和删除,以及组策略的部署。 - **日志审计**:通过查询活动目录记录用户的登录、注销等...

Global site tag (gtag.js) - Google Analytics