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 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...
如果控制器未正确验证或转义用户输入,那么就可能为攻击者提供机会进行LDAP注入。MVC模式下的应用程序应当确保所有外部输入都经过严格的过滤和验证,以防止这种类型的攻击。 **LDAP盲注入的检测与利用**: - **检测...
本文档旨在详细介绍LDAP API的基本概念、使用方法及相关操作步骤。 #### 二、LDAP模型概述 LDAP模型基于一种层次化的结构,其中每个节点被称为**条目**(Entry),每个条目由一组**属性**(Attribute)构成。这些...
4. **条目(Entry)**:包含在目录中的单个信息项,由一组属性组成。 5. **域名(Domain Component, dc)**:表示域名空间的一部分,通常用作LDAP目录的顶级容器。 #### 四、LDAP协议的发展历程 - **LDAP v1**:最初...
LDAP注入攻击类似于SQL注入攻击,其核心在于利用未经适当处理或验证的用户输入来构造恶意的LDAP查询语句,从而获取未授权的信息或执行非法操作。攻击者通常会在用户提交的数据中嵌入特殊字符或命令,以此操纵最终...
2. **查询 LDAP 数据**:通过 LDAP 查询语句(如 LDAP Filter)获取需要的联系人信息。 3. **解析 LDAP 结果**:将查询结果转换为 Python 对象,便于进一步处理。 4. **创建 VCard 对象**:利用 `vobject` 库,为每...
Realm实现了`AuthenticationInfo`接口,提供获取用户身份验证信息的方法。当用户尝试登录时,Shiro会向 Realm 提供用户名和密码,然后 Realm 会去查找并验证这些凭证。 3. **多个Realm**:在更复杂的应用中,可能...
Yale CAS 是耶鲁大学开发的一种开源的单点登录(SSO)解决方案,提供了一个通用的身份验证框架,允许用户使用单个身份验证来访问多个应用程序。CAS 服务器充当着身份验证服务器的角色,负责验证用户的身份,生成 ...
1. **ldapsearch**: 这个工具允许用户查询LDAP服务器以获取特定信息。通过指定过滤条件和搜索基,可以定位到所需的条目。例如,查找所有属于某个组的用户或者具有特定属性的条目。 2. **ldapadd**: 此工具用于向...
这可能导致返回所有管理员用户的记录,而非预期的单个用户。 **漏洞影响** CVE-2020-8840对受感染系统的潜在影响非常严重,因为 LDAP 通常用于存储重要的认证信息,如用户名、密码哈希以及用户的角色和权限。一旦...
CAS(Central Authentication Service)是基于Java的开源身份验证框架,主要功能是实现Web应用的单点登录(Single Sign-On,简称SSO)。SSO允许用户通过一次登录,就能访问多个相互信任的应用系统,无需在每个系统中...
CAS(Central Authentication Service)服务器是一种基于Java的开源身份验证协议,它允许用户通过单个登录(Single Sign-On,SSO)访问多个应用系统。CAS Server是这个协议的实现,为组织提供了一种集中式的身份验证...
3.2.3. 提权登录堡垒机还支持提权登录功能,即在普通权限的基础上获取更高的系统权限。这在执行特定操作或管理任务时非常有用。在创建或编辑主机账号时,勾选“允许提权”选项,并填写提权用户名和密码,这样用户在...
4. **认证与授权**:zApplicationSecurity通过集成LDAP服务实现用户身份验证,确保只有经过验证的用户才能登录和执行操作。 5. **审计和日志记录**:记录所有的系统活动,以便于追踪潜在的安全威胁和合规性检查。 ...
- 设置用户配额有助于防止单个用户过度占用存储资源。 **5.3 Openfiler文件服务功能总结** - Openfiler提供了丰富的文件服务功能,包括但不限于SMB/CIFS、FTP、NFS等协议的支持,以及磁盘配额的管理。 #### 六、...
5. **会话管理**:Spring Security也提供了会话管理功能,可以防止会话固定攻击,设置会话超时策略,并能控制单个用户登录的并发会话数量。 6. **密码加密**:为了增强安全性,Spring Security提供了密码加密机制。...
SecurityManager的配置是Shiro应用的关键部分,因为它连接到Realm以获取用户和权限信息。 3. **Realm**:Realm是Shiro与应用安全数据之间的桥梁,它对接各种安全数据源,如LDAP、JDBC数据库、INI配置或属性文件。 ...
- **身份验证和授权**:编写脚本自动验证用户登录,或者根据用户角色分配权限。 - **系统管理**:自动化用户账户的创建、修改和删除,以及组策略的部署。 - **日志审计**:通过查询活动目录记录用户的登录、注销等...