gpt4 book ai didi

java - 如何在 Java 中针对 AD 对用户进行身份验证

转载 作者:行者123 更新时间:2023-12-02 08:13:47 25 4
gpt4 key购买 nike

我正在使用 JNDI 库从 Java Web 应用程序访问 AD。我使用技术用户通过 LDAP 对 AD 进行身份验证,如下所示:

    Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT);
ldapEnv.put(Context.PROVIDER_URL, providerUrl);
ldapEnv.put(Context.SECURITY_AUTHENTICATION,
SECURITY_AUTHENTICATION_SIMPLE);
ldapEnv.put(Context.SECURITY_PRINCIPAL, principal);
ldapEnv.put(Context.SECURITY_CREDENTIALS, credentials);
return new InitialDirContext(ldapEnv);

我使用此用户从 AD 读取数据或向 AD 写入数据。

但在那之后,我不知道如何使用他的用户名和密码来验证真正访问我的网络应用程序的最终用户。

我读到了有关使用 Context 类中的 find 方法的信息,但我不确定如何执行或如何构建搜索过滤器。例如

(&(cn= ....

我也不知道如何查找 AD 中的所有用户。我想在我的网络应用程序中显示 AD 中所有可用用户的列表

最佳答案

-验证用户身份

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://url/");

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "domain\\user_name");
env.put(Context.SECURITY_CREDENTIALS, "password");

InitialLdapContext ctx = new InitialLdapContext(env,null);
boolean authenticated = (ctx != null) ? true : false;

-获取所有用户的姓名

public ArrayList<String> getAllUsers(LdapContext ctx) {
ArrayList<String> users = new ArrayList<>();
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

String[] attrIDs = {"cn"};
constraints.setReturningAttributes(attrIDs);

NamingEnumeration answer = ctx.search("dc=example,dc=com", "(&(cn=*))", constraints);

while (answer.hasMore()) {
Attributes attrs = ((SearchResult) answer.next()).getAttributes();
users.add(attrs.get("cn").toString().replace("cn:", ""));
}

} catch (Exception ex) {
}
return users;
}

-搜索特定用途

public String getUserName(String username, LdapContext ctx) {
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

String[] attrIDs = {"cn"};
constraints.setReturningAttributes(attrIDs);

NamingEnumeration answer = ctx.search("OU=Employees,OU=Users,DC=sub_domain,DC=domain,DC=com", "uid=" + username, constraints);

if (answer.hasMore()) {
Attributes attrs = ((SearchResult) answer.next()).getAttributes();
return attrs.get("cn").toString().replace("cn:", "");
} else {
return null;
}

} catch (Exception ex) {
}
return null;
}

您可以从以下位置获取有关搜索查询的更多详细信息 this

关于java - 如何在 Java 中针对 AD 对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28883415/

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