gpt4 book ai didi

java - LDAP:如何使用连接详细信息对用户进行身份验证

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:03:54 25 4
gpt4 key购买 nike

我无法使用 LDAP 对用户进行身份验证。我有以下详细信息:

URL=ldap://10.10.10.10:389 
LDAP BASE:DC=lab2,DC=ins
LDAP Bind Account: CN=Ldap Bind,OU=Service Accounts,OU=TECH,DC=lab2,DC=ins
LDAP Bind Account Pw: secret

我可以使用上述详细信息搜索 sAMAccountName 值,但是如何使用用户名和密码对用户进行身份验证?
如果您遵循我之前的问题,那么您就会明白,我能够成功连接到 LDAP 服务器,但无法验证他的身份。
要验证的用户:

user: someusername
password: somepwd

我无法使用 'somepwd' 连接到 LDAP 服务器,我应该如何使用 someusername。我能够以 sAMAccountName 的形式搜索给定用户。

最佳答案

这是我在不同地方找到的东西的混搭。如果您不想使用 UnboundID SDK,它应该会让您走上正确的道路。这不是生产质量,如果您的商店支持,您可能需要在此处添加 SSL 内容。

public static Boolean validateLogin(String userName, String userPassword) {
Hashtable<String, String> env = new Hashtable<String, String>();


env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN);

// To get rid of the PartialResultException when using Active Directory
env.put(Context.REFERRAL, "follow");

// Needed for the Bind (User Authorized to Query the LDAP server)
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, LDAP_BIND_DN);
env.put(Context.SECURITY_CREDENTIALS, LDAP_BIND_PASSWORD);

DirContext ctx;
try {
ctx = new InitialDirContext(env);
} catch (NamingException e) {
throw new RuntimeException(e);
}

NamingEnumeration<SearchResult> results = null;

try {
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search Entire Subtree
controls.setCountLimit(1); //Sets the maximum number of entries to be returned as a result of the search
controls.setTimeLimit(5000); // Sets the time limit of these SearchControls in milliseconds

String searchString = "(&(objectCategory=user)(sAMAccountName=" + userName + "))";

results = ctx.search("", searchString, controls);

if (results.hasMore()) {

SearchResult result = (SearchResult) results.next();
Attributes attrs = result.getAttributes();
Attribute dnAttr = attrs.get("distinguishedName");
String dn = (String) dnAttr.get();

// User Exists, Validate the Password

env.put(Context.SECURITY_PRINCIPAL, dn);
env.put(Context.SECURITY_CREDENTIALS, userPassword);

new InitialDirContext(env); // Exception will be thrown on Invalid case
return true;
}
else
return false;

} catch (AuthenticationException e) { // Invalid Login

return false;
} catch (NameNotFoundException e) { // The base context was not found.

return false;
} catch (SizeLimitExceededException e) {
throw new RuntimeException("LDAP Query Limit Exceeded, adjust the query to bring back less records", e);
} catch (NamingException e) {
throw new RuntimeException(e);
} finally {

if (results != null) {
try { results.close(); } catch (Exception e) { /* Do Nothing */ }
}

if (ctx != null) {
try { ctx.close(); } catch (Exception e) { /* Do Nothing */ }
}
}
}

关于java - LDAP:如何使用连接详细信息对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com