0

通用名称,假设“John Smith”用于组成 DN,但是否可以使用 UID 组成完整的 DN。

我目前正在这样做并且它有效。

Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
env.put(Context.PROVIDER_URL, "ldap://myDomain.com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "CN=John Smith,OU=IT,OU=MyCompany,OU=Users,DC=myDomain,DC=com");
env.put(Context.SECURITY_CREDENTIALS, "myPassWrd");

现在我想用UIDJ.smith 代替他的全名进行身份验证。有任何想法吗?

4

2 回答 2

2

在我们的 LDAP 身份验证例程中,我们创建一个jndi用户帐户,应用程序使用该用户帐户在 LDAP 中验证自己,一旦应用程序使用 jndi 用户的可分辨名称(例如:)建立连接,uid=jndi,ou=branch,dc=com,dc=your,dc=organization然后(为用户节点提供一个分支树)它使用以下代码检查用户uid是否在 LDAP 树中:

public String findUserDnByBranchAndUid(String branchName, String uid) throws NamingException {
    SearchControls searchControls = new SearchControls();
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    searchControls.setCountLimit(1);

    NamingEnumeration<SearchResult> answer;
    answer = dirContext.search(branchName, String.format("(uid=%s)", uid), searchControls);

    if (answer.hasMoreElements()) {
        SearchResult searchResult = answer.nextElement();
        return searchResult.getNameInNamespace();
    } else {
        return null;
    }
}

像这样称呼它:

String userDn = findUserDnByBranchAndUid("ou=users,dc=com,dc=your,dc=organization", "jsmith");

如果userDn不为空,则用户存在于树中,然后我们继续使用该 DN(和用户密码)而不是 jndi 用户 DN 建立新连接。

如果一切顺利,那么用户jsmith只需使用他/她的 id 就可以使用其凭据登录,而无需提供任何对用户不友好的 DN。

于 2013-01-24T19:37:07.860 回答
1

我用:

 env.put(Context.SECURITY_PRINCIPAL, username);
 env.put(Context.SECURITY_CREDENTIALS, password); 

为我工作。

于 2013-01-24T18:35:47.930 回答