Как мне get (a, b) => c из a => b => c в Scala?

public static void main(String[] args)
{
    String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
    String MY_HOST = "ldap://Localhost:1389";
    String MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal";
    String MGR_PW = "password";           

    //Identify service provider to use
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
    env.put(Context.PROVIDER_URL, MY_HOST);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, MGR_DN);
    env.put(Context.SECURITY_CREDENTIALS, MGR_PW);

    try
    {
        // Create the initial directory context
        InitialDirContext initialContext = new InitialDirContext(env);

        System.out.println("Context Sucessfully Initialized");
    }
    catch(Exception e)
    {
        System.err.println(e);
    }
}

Я хотел бы спросить, когда я устанавливаю MGR_DN = "cn = John, ou = Users, o = IT, dc = QuizPortal " - MGR_DN =" uid = 103, ou = Пользователи, o = IT, dc = QuizPortal ". В основном, переходя от cn к uid, я столкнулся бы с ошибкой

javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials]

. Я проходил аутентификацию, когда указан как cn = John , но не uid = 103 . Разве мне не разрешено указывать с помощью uid?

9
задан ROMANIA_engineer 21 November 2015 в 22:48
поделиться

3 ответа

Вы должны указать DN или отличительное имя. Это имя, под которым пользователь связан в каталоге. Вы не можете просто выбрать любую цепочку атрибутов. Если ваши пользователи связаны через атрибут 'cn', то только атрибут 'cn' является частью DN.

4
ответ дан 4 December 2019 в 14:26
поделиться

Если вы заранее не знаете точный DN, вам следует сначала выполнить поиск в каталоге LDAP. Это можно сделать примерно так (убедитесь, что вы уловили соответствующие исключения):

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapServerUrl);
env.put(Context.SECURITY_AUTHENTICATION, "none");

SearchControls searchCtrls = new SearchControls();
searchCtrls.setReturningAttributes(new String[] {});
searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE);

String filter = "(&(cn=" + identifier + "))";

DirContext ctx = null;
ctx = new InitialDirContext(env);
NamingEnumeration<SearchResult> answer = ctx.search(
   ldapBaseDN, filter, searchCtrls);

String fullDN = null;
if (answer.hasMore()) {
    fullDN = answer.next().getNameInNamespace();

    ctx.close();
    ctx = null;

    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, fullDN);
    env.put(Context.SECURITY_CREDENTIALS, password);

    ctx = new InitialDirContext(env);
    return true;
}
// Exception otherwise ...

Здесь фильтр поиска "(& (cn =" + identifier + "))" (так , например (& (cn = John)) ), но вместо этого вы можете использовать uid . Уникальность результатов зависит от конфигурации сервера LDAP. Базовое DN также зависит от способа его настройки (в вашем примере это может быть ou = Users, o = IT, dc = QuizPortal ).

8
ответ дан 4 December 2019 в 14:26
поделиться

Похоже на проблему конфигурации сервера. Вот похожая проблема, включая решение. В основном вам нужно указать, использовать ли uid или cn для аутентификации в ldap-authentication.properties.

2
ответ дан 4 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: