Проверка подлинности Java LDAP с использованием имени пользователя и пароля - PullRequest
19 голосов
/ 10 июня 2011

У меня есть рабочий фрагмент кода, с помощью которого я могу аутентифицировать пользователя по dn и паролю.Мое требование состоит в том, что пользователь будет вводить свое имя пользователя (sAMAccountName), и я хочу аутентифицироваться, используя sAMAccountName и пароль.Как я могу изменить этот код для достижения этого?

    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 ]

45 голосов
/ 01 июня 2012

Надеюсь, это поможет многим из вас.

Вам не нужна вся пользовательская иерархия с 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;
    }
2 голосов
/ 10 июня 2011

Можете ли вы попробовать заполнить Context.PROVIDER_URL следующим образом:

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

Думаю, было бы лучше использовать GSSAPI, возможно, вы можете посмотреть здесь и здесь

...