如何检查给定的用户名是否存在?

时间:2011-09-29 09:41:43

标签: java ldap

我有一个使用LDAP和简单数据库身份验证的应用程序来记录用户。只有当用户在LDAP上下文中不存在时,应用程序才会检查他是否存在于数据库中。所以我需要一种方法来检查用户是否存在于LDAP中,而不知道密码。我提到用户名是唯一的。

我使用此代码,如果我有正确的用户名和密码,则可以使用此代码。如果密码或用户名错误,我会得到一个例外。如果我能得到不同的例外,那将是理想的,如果用户名不存在,则为1,如果提供的密码错误,则为其他例外。

    String username = "test";
    String password = "pass";
    Hashtable<String, String> environment = new Hashtable<String, String>();
    environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    environment.put(Context.PROVIDER_URL, "ldap://server.example.com:389");
    environment.put(Context.SECURITY_AUTHENTICATION, "simple");
    String user = username + "@example.com";
    environment.put(Context.SECURITY_PRINCIPAL, user ); 
    environment.put(Context.SECURITY_CREDENTIALS, password);
    try
    {
        DirContext context = new InitialDirContext(environment);

        String searchBase = "DC=server,DC=example,DC=COM";
        String FILTER = "(&(objectClass=user)(objectCategory=person)((sAMAccountName=" + username + ")))";
        SearchControls ctls = new SearchControls();
        ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        NamingEnumeration<SearchResult> answer = context.search(searchBase, FILTER, ctls);
        SearchResult result = answer.next();
        Attribute email = result.getAttributes().get("mail");
        Attribute cn = result.getAttributes().get("cn");
        System.out.println(cn + " : " + email);
        context.close();
    }
    catch (AuthenticationException a)
    {
        Logger.getLogger().info("Authentication failed: " + a.getExplanation());

    }
    catch (NamingException e)
    {
        Logger.getLogger().info("Failed to bind to LDAP: " + e.getExplanation());
    }

1 个答案:

答案 0 :(得分:3)

您只使用他的用户名在LDAP中搜索用户。但是要对LDAP进行身份验证,您将使用搜索到的用户名和密码。

只需使用其他(管理员)用户和密码进行身份验证,如果搜索用户返回内容,则返回true。