如何在LDAP中使用DN和密码在Java中绑定?

如何在LDAP中使用DN和密码在Java中绑定?,java,ldap,bind,Java,Ldap,Bind,我想从LDAP中搜索一个用户,在获得要连接的用户后(验证) 使用其DN和密码的特定用户 我已成功获取DN,但不知道如何绑定它?以下是我从中获取的示例: 您必须选择正确的身份验证模型。我以前试过,效果很好 使用LDAP连接到目录服务器时,连接状态为未经身份验证。如果服务器管理员允许未经验证的请求,则可以在未经验证的连接上传输请求。该请求用于更改连接的身份验证状态 下面是一个使用进行搜索和身份验证的示例:。本例搜索给定基本对象、命名属性和用户名的条目,然后尝试使用简单绑定进行身份验证。使用SASL绑

我想从LDAP中搜索一个用户,在获得要连接的用户后(验证) 使用其DN和密码的特定用户
我已成功获取DN,但不知道如何绑定它?

以下是我从中获取的示例:


您必须选择正确的身份验证模型。我以前试过,效果很好

使用LDAP连接到目录服务器时,连接状态为未经身份验证。如果服务器管理员允许未经验证的请求,则可以在未经验证的连接上传输请求。该请求用于更改连接的身份验证状态

下面是一个使用进行搜索和身份验证的示例:。本例搜索给定基本对象、命名属性和用户名的条目,然后尝试使用
简单绑定进行身份验证。使用SASL绑定的示例也可以轻松构建。

LDAP bind()操作对应于JNDI中的以下操作:

  • 使用环境中足够的信息构建
    InitialDirContext
    InitialLdapContext
    以导致登录,即安全主体和凭据,或

  • LdapContext
    上调用
    reconnect()
    ,该文本最初是在环境中没有任何安全信息的情况下获得的,或者使用与不同主体相关的安全信息,但其环境随后已被修改


  • 如果已经使用凭据打开了LdapContext,则可以复制它,在其环境中更改主体+凭据,然后尝试重新连接:

    LdapContext userContext = ldapContext.newInstance(null); // copy context
    userContext.addToEnvironment(InitialDirContext.SECURITY_PRINCIPAL, userDn);
    userContext.addToEnvironment(InitialDirContext.SECURITY_CREDENTIALS, password);
    userContext.reconnect(null); // throws NamingException if creds wrong
    userContext.close();
    
    如果抛出NamingException,则表示凭据错误。如果成功,则凭证正常。;)


    (如果您只有LdapContext,但没有InitialDirContext,这将非常有用。)

    Ya这对我也适用。问题是,在获得DirContext ctx对象后,我想绑定一个新用户以检查其有效性,我拥有该用户的完整DN和密码。这是可能的吗?这来自Oracle JNDI教程,而不是“官方文档”,即Javadoc或JNDI规范。感谢您的提示,第二个对我很有帮助:如果你已经有了LdapContext,并且你想根据它验证同一个用户,你可以使用
    lookup(“”
    )复制你的DirContext,使用
    addToEnvironment(…)
    更改主体+凭证,如果你用一个主体创建上下文,只需尝试
    重新连接(null)
    :),并且还指定使用连接池,您的逻辑是否会导致创建新连接?或者,它会重用池中的现有连接吗?当我尝试时,这不起作用。我更改了用户和密码。但是,如果我们将原始凭证设置回原位,它将重新连接。我认为应该注意,Java8和更早版本不会建立新连接,但9-13似乎与建立了全新的连接。JDK 14再次说明了这一点。指向SimpleIndexample.java的链接似乎无效。
    LdapContext userContext = ldapContext.newInstance(null); // copy context
    userContext.addToEnvironment(InitialDirContext.SECURITY_PRINCIPAL, userDn);
    userContext.addToEnvironment(InitialDirContext.SECURITY_CREDENTIALS, password);
    userContext.reconnect(null); // throws NamingException if creds wrong
    userContext.close();