DN - Java JDNI LDAP - 通用名称与用户ID

时间:2013-01-24 17:13:48

标签: java ldap distinguishedname

通用名称,假设使用“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");

现在我想使用UID,例如J.smith,进行身份验证而不是他的全名。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

uid

这样称呼:

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"); 不为空,则用户存在于树中,然后我们继续使用该DN(和用户密码)而不是jndi用户DN建立新的连接。

如果进行顺利,那么用户userDn使用其凭据只使用他/她的ID登录,而不提供任何非用户友好的DN。

答案 1 :(得分:1)

我用:

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

适合我。

相关问题