Аутентификация на LDAP с текущим пользователем в JNDI/Java

Я думал, что найду больше об этой теме, но я не нашел.

Я должен написать Java-приложение, которое проверяет, частью какого конкретного пользователя является.

Но для аутентификации на сервере я не могу запросить имя пользователя и пароль, а также не могу сохранить его в источнике (или каком-либо другом файле).

Есть ли способ с JNDI и Java для аутентификации пользователя, который в настоящее время вошел в систему?

3 ответа

Решение

Поскольку кажется, что нет реального решения этого вопроса, я теперь иду с запросом информации для входа в систему в начале сценария / инструмента и использую ее при необходимости.

Все, что вы можете сделать, это проверить, есть ли какой-либо пользователь с тем же именем пользователя, что и пользователь, который в данный момент вошел в ваше Java-приложение. Вы не сможете проверить что-либо еще без его пароля. Для этого вам понадобятся имя пользователя и пароль пользователя ldap, у которого есть разрешение на перечисление других пользователей. Затем вы можете запросить LDAP для вашего пользователя.

Это пример, адаптированный из чего-то, что я использую, он сравнивает с активным каталогом, поэтому, возможно, потребуются некоторые изменения:

boolean userFound = user_exits("searchUser",
        "searchPassword",
        "(sAMAccountName={USERNAME})",
        "ldap://ldap.mydomain.com",
        "OU=MYOU,dc=mydomain,dc=com");

private boolean user_exits(String searchUser, String searchPassword,
        String filter, String url, String baseDn) throws NamingException {
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, searchUser);
env.put(Context.SECURITY_CREDENTIALS, searchPassword);

try {
    ctx = new InitialDirContext(env);
        String[] attributeFilter = {};
        SearchControls sc = new SearchControls();
        sc.setReturningAttributes(attributeFilter);
        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

        NamingEnumeration<SearchResult> results = ctx.search(baseDn, filter, sc);
        return results.hasMore();

    } catch (NamingException e) {
        throw e;
    } finally {
        if (ctx != null) {
            try {
                ctx.close();
            } catch (NamingException e) {}
        }
    }       
}

Если у клиента LDAP есть существующее соединение, используйте либо who am i? расширенный запрос, или authorization identity request control чтобы определить authID существующего соединения - LDAP-совместимые серверы и UnboundID LDAP SDK будут поддерживать любой из этих методов. who am i? расширенный запрос может быть использован в любое время в соединении (при условии, что идентификация аутентификации имеет разрешение на использование расширенного запроса), но authorization identity request control можно прикрепить только к запросу на привязку.

Использование who am i? расширенный запрос и authorization identity request control демонстрируются в AuthDemo.java.

Смотрите также

Другие вопросы по тегам