在我们的 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。