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

DN-Java JDNI LDAP-通用名称与用户Id,java,ldap,distinguishedname,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

通用名称,比如说“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,代替他的全名进行身份验证。有什么想法吗?

我使用:

 env.put(Context.SECURITY_PRINCIPAL, username);
 env.put(Context.SECURITY_CREDENTIALS, password); 
适合我。

我使用:

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

对我有效。

在我们的LDAP授权例程中,一旦应用程序使用jndi用户的可分辨名称(例如:
uid=jndi,ou=branch,dc=com,dc=your,dc=organization
)建立连接,我们就创建一个应用程序用于在LDAP中验证自身的jndi用户帐户(为树中的用户节点提供了一个分支)它使用以下代码检查用户
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;
    }
}
如果
userDn
不为空,则该用户存在于树中,然后我们继续使用该DN(和用户密码)而不是jndi用户DN建立新连接


如果一切顺利,那么用户
jsmith
只使用其id的凭据登录,而不提供任何不友好的DN。

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


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

@MichelBehlok那么用户名字符串必须与目录中的任何内容匹配。非常感谢。@MichelBehlok您添加at域的解决方案非常完美。@MichelBehlok用户名字符串必须匹配目录中的任何内容。非常感谢。@MichelBehlok您添加at域的解决方案非常完美。