2011-06-10 144 views
19

我有一个工作代码片段,我可以通过dn和密码对用户进行认证。我的要求是用户将输入他的用户名(sAMAccountName),我想用sAMAccountName和密码进行身份验证。我如何修改此代码来实现它?使用用户名和密码的Java LDAP认证

String userName = "John P R-Asst General Manager"; 
    String passWord = "asdfgh123"; 
    String base ="OU=SOU,DC=example,DC=com"; 
    String dn = "cn=" + userName + "," + base; 

    String ldapURL = "ldap://mdsdc3.example.com:389"; 
    authEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
    authEnv.put(Context.PROVIDER_URL, ldapURL); 
    authEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    authEnv.put(Context.SECURITY_PRINCIPAL, dn); 
    authEnv.put(Context.SECURITY_CREDENTIALS, password); 

    try { 
     DirContext authContext = new InitialDirContext(authEnv); 
     return true; 

    } catch (NamingException namEx) { 
     return false; 
    } 

回答

2

你可以尝试完成Context.PROVIDER_URL这样的:

String ldapURL = "ldap://mdsdc3.example.com:389/DC=example,DC=com"; 

我认为这将是更好地使用GSSAPI,或许你可以看看herehere

43

我希望这有助于你们中的许多人。

你并不需要用CN,DN的所有用户层次结构等

您可以登录刚好路过域\用户名和密码。

我有我的代码工作,因为它是波纹管:

try 
    { 
     // Set up the environment for creating the initial context 
     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:389"); 
     // 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "domain\\user"); //we have 2 \\ because it's a escape char 
     env.put(Context.SECURITY_CREDENTIALS, "test"); 

     // Create the initial context 

     DirContext ctx = new InitialDirContext(env); 
     boolean result = ctx != null; 

     if(ctx != null) 
      ctx.close(); 

     return result; 
    } 
    catch (Exception e) 
    {   
     return false; 
    }