我想从 LDAP 中搜索一个用户,并在获得想要连接(验证)该特定用户的用户后,使用他的 DN 和密码我已成功获取 DN 但不知道如何绑定它?
4 回答
这是我从官方文档中获取的示例:
// Set up the environment for creating the initial context
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
DirContext ctx = new InitialDirContext(env);
您必须选择正确的身份验证模型。我之前尝试过并且效果很好。
LDAP bind() 操作对应于 JNDI 中的以下内容:
在环境中构造一个
InitialDirContext
或InitialLdapContext
具有足够的信息以导致登录,即安全主体和凭据,或调用最初获得
reconnect()
的LdapContext
环境中没有任何安全信息,或者具有与不同主体相关的安全信息,但其环境随后已被修改。
当使用 LDAP 与目录服务器建立连接时,连接状态是未经身份验证的。假设服务器管理员允许未经身份验证的请求,则可以在未经身份验证的连接上传输请求。BIND请求用于更改连接的身份验证状态。
下面是使用UnboundID LDAP SDK进行搜索和验证的示例:SimpleBindExample.java。此示例搜索给定基础对象、命名属性和用户名的条目,然后尝试使用simple bind
. 使用 SASL 绑定的示例可以很容易地构建。
如果您已经使用您的凭据打开了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,这很有用。)