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

时间:2015-03-05 16:58:04

标签: java authentication ldap jndi

我正在使用JNDI库从Java Webapp访问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读取和写入。

但在那之后,我不知道如何使用他的用户和密码验证真正访问我的webapp的最终用户。

我读过使用Context类中的find方法但我不确定如何构建或如何构建搜索过滤器。例如

(&(cn= ....

我不知道如何为AD中的所有用户找到。我想在我的webapp中显示AD中所有可用用户的列表

5 个答案:

答案 0 :(得分:2)

为什么不让每个用户对其进行身份验证。

请参阅http://docs.oracle.com/javase/jndi/tutorial/ldap/security/ldap.html

如果您获得该用户的上下文,则表示用户名&amp;密码是正确的。如果没有,你不会得到例外&amp;发送用户登录界面等。

如果经过身份验证,请不要忘记关闭finally块中的Context。

答案 1 :(得分:2)

我相信此链接可以节省您的一天:
http://www.javaxt.com/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory 您可以对用户进行身份验证并列出域的用户。

答案 2 :(得分:2)

- 要验证你需要为每个试图登录的用户创建dir上下文,就像你在问题中提到的那样。

- 或者如果您将Weblogic作为Appserver,则可以使用WL容器身份验证来处理用户登录,方法是将AD配置为WL中的身份验证并保护您的登录URL。 :阅读更多Configuring container-managed security in Weblogic

- 列出Root DSE或某个基本DN下的所有用户

  1. 创建Dir Context以指向Root DSE或其下的DN

    DirContext ctx = InitialDirContext(ldapEnv);

  2. context.search()传递返回属性,搜索控件和匹配用户对象类和登录属性的搜索过滤器

    SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String [] {“cn”,“objectGUID”}); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter =“(&amp;(cn = *)(|(objectclass = person)(objectclass = organizationalPerson)))”;

    NamingEnumeration searchResult = ctx.search(“”,filter,controls);

  3. - 要搜索特定用户,请修改过滤器以匹配用户cn或任何其他属性

    String filter = "(&(cn=Rafa Romero)(|(objectclass=person)(objectclass=organizationalPerson)))";
    

答案 3 :(得分:2)

大多数servlet容器都可以配置为通过LDAP进行身份验证,这比滚动自己的身份验证代码更安全可靠。

For example

答案 4 :(得分:2)

- 验证用户

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;

- 获取所有用户&#39;名称

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=domain,DC=ifsworld,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