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

如何在Java中针对AD对用户进行身份验证,java,authentication,ldap,jndi,Java,Authentication,Ldap,Jndi,我正在使用JNDI库从JavaWebApp访问广告。我使用技术用户通过LDAP对AD进行身份验证,如下所示: Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11); ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT); ldapEnv.put(Context.PROVIDER_URL, pro

我正在使用JNDI库从JavaWebApp访问广告。我使用技术用户通过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);

我也不知道如何查找广告中的所有用户。我想在我的webapp中显示广告中所有可用用户的列表,为什么不为每个用户使用相同的列表进行身份验证

如果您获得了该用户的上下文,则表示用户名和密码是正确的。如果不是,则您将获得异常并将其发送到用户登录屏幕等


如果经过身份验证,请不要忘记关闭finally block中的上下文。

我相信此链接将节省您的时间:

您可以对用户进行身份验证并列出域的用户。

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

--或者,如果您的Appserver是Weblogic,则可以通过将AD配置为WL中的AuthenticateToE并保护您的登录URL,使用WL容器身份验证来处理用户登录:阅读更多

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

  • 创建指向根DSE或其下的DN的Dir上下文

    DirContext ctx=InitialDirContext(ldapEnv)

  • Do context.search()传递返回属性、搜索控件和匹配用户对象类和登录属性的搜索筛选器

    String filter = "(&(cn=Rafa Romero)(|(objectclass=person)(objectclass=organizationalPerson)))";
    
    SearchControls=新的SearchControls(); 控件。SetReturningAttribute(新字符串[]{“cn”,“objectGUID”}); 控件.setSearchScope(SearchControls.SUBTREE_范围); String filter=“(&(cn=*)(|(objectclass=person)(objectclass=organizationalPerson))”

    NamingEnumeration searchResult=ctx.search(“”,过滤器,控件)

  • -要搜索特定用户,请修改筛选器以匹配用户cn或任何其他属性

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

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


    -验证用户身份

    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;
    
    您可以从中获取有关搜索查询的更多详细信息

    您使用的是哪个应用程序/Web服务器?玻璃鱼?
    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;
    }