InMemoryDirectoryServer, обработка запросов (привязка, изменение и т. д.)

Я использую InMemoryDirectoryServer из UnboundID SDK. Как обрабатывать запросы ldap от клиента ldap?

Вот код, который я нашел (в Как получить DN и пароль с помощью UnboundID):

public class MyLDAPListenerRequestHandler extends LDAPListenerRequestHandler {

@Override
public LDAPListenerRequestHandler newInstance(
        LDAPListenerClientConnection arg0) throws LDAPException {
        System.out.println("New Instance.");
        LDAPConnectionOptions option = new LDAPConnectionOptions();
        LDAPConnection connection = new LDAPConnection(option, "yourIPadress", yourport);
        System.out.println("Connected to : " + connection.getConnectedAddress()+ " " + connection.getConnectedPort());

    return this;
}

@Override
public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
        List<Control> arg2) {
    System.out.println(arg1.getBindDN());
    System.out.println(arg1.getSimplePassword());
    return null;
}

Является ли это правильным способом захвата запроса на привязку и обработки его под

public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
        List<Control> arg2) {

функция? Нужно ли после обработки вручную отправлять привязку к экземпляру InMemoryDirectoryServer?

Привет еще раз,

на основе: http://sourceforge.net/p/ldap-sdk/discussion/1001257/thread/796c129d

мне кажется, что можно изменить источник InMemoryRequestHandler и изменить способ ответа на запросы ldap (поиск, изменение,...).

Для разыменования псевдонима я изменил

for (конечный SearchResultEntry e : entryList)

цикл в функции:

общедоступный синхронизированный процесс LDAPMessageSearchRequest(final int messageID, окончательный запрос SearchRequestProtocolOp, окончательные элементы управления List) {

с этим кодом:

for (final SearchResultEntry e : entryList)
{

    // flag which is set if for loop finds an alias entry.
    boolean aliasEntryFound = false;
    // aliasedObjectName reference to real entry.
    String aliasedObjectName = null;

    // Check that dereferencing is turned on.
    if (aliasDeref)
    {            
        // check if entry is an alias entry. 
        for (String objectClass : e.getAttributeValues("objectClass"))
        {
            if (objectClass.equalsIgnoreCase("alias"))
            {
                // Put on flag.
                aliasEntryFound = true;                    
                // Get real entry path. 
                aliasedObjectName = e.getAttributeValue("aliasedObjectName");

            }
        }

    }

    // If entry e is actually alias entry, then ...
    if (aliasEntryFound && aliasedObjectName != null)
    {
        // Build new SearchRequest query with aliasedObjectName as real DN.
        final SearchRequestProtocolOp newRequest = new SearchRequestProtocolOp(
                aliasedObjectName, request.getScope(), request.getDerefPolicy(),
                request.getSizeLimit(), request.getTimeLimit(),
                false, request.getFilter(), request.getAttributes());
        // Call recursively processSearchRequest() with new request value.
        processSearchRequest(messageID, newRequest, controls);

    }
    else
    {
            try {
                connection.sendSearchResultEntry(messageID, e, e.getControls());
            } catch (final LDAPException le) {
                Debug.debugException(le);
                return new LDAPMessage(messageID, new SearchResultDoneProtocolOp(le.getResultCode().intValue(), le.getMatchedDN(),
                        le.getDiagnosticMessage(), StaticUtils.toList(le.getReferralURLs())), le.getResponseControls());
            }
    }
}
...
}

Где-то в начале класса InMemoryRequestHandler я добавил:

private boolean aliasDeref = true;

который я просто использую в качестве флага, чтобы контролировать, хочу ли я разыменовывать псевдоним или нет.

Мой код — это всего лишь пример того, как выполнять разыменование псевдонима по поисковому запросу. С помощью пользовательского обработчика запросов можно только оповещать запросы ldap, но не ответы или результаты ldap.

Дайте мне знать, если есть лучший способ сделать это. спасибо


person Igor Delac    schedule 07.02.2013    source источник


Ответы (1)


Пакет UnboundID LDAP SDK для Java предоставляет платформу LDAPListener, позволяющую создавать собственный код, который принимает запросы LDAP от клиентов и может возвращать им ответы. Когда LDAPListener получает запрос, он использует LDAPListenerRequestHandler для обработки запроса и генерации результата.

Сервер каталогов в памяти использует InMemoryRequestHandler для выполнения этой обработки, но вы можете создать свою собственную реализацию обработчика запросов, которая делает все, что вы хотите (например, CannedResponseRequestHandler привязкой возвращает фиксированный ответ на любой запрос), и вы можете иметь обработчик запросов. который выполняет некоторую обработку перед делегированием другому обработчику запросов (например, реализации AccessLogRequestHandler и LDAPDebuggerRequestHandler перехватывают запросы и записывают информацию о них в файл журнала перед их пересылкой другому обработчику запросов, а затем перехватывают и регистрируют информацию об ответе перед его возвратом обратно клиенту; и наоборот, ProxyRequestHandler выполняет обработку на другом сервере каталогов через LDAP).

Если вы хотите обеспечить пользовательскую обработку, вам следует создать собственный подкласс LDAPListenerRequestHandler (и, как вы предполагали, метод processBindRequest может использоваться для выполнения обработки операции привязки). Если этот обработчик запроса выполняет всю обработку операции, вы можете создать и вернуть ответ самостоятельно. Если вам просто нужно перехватить запрос и получить информацию о нем, прежде чем перенаправить его на что-то еще, что действительно выполнит обработку, вам следует делегировать другому обработчику запросов. В LDAP SDK уже есть примеры того и другого, поэтому вы можете использовать их в качестве модели для создания того, что вам нужно.

person Neil Wilson    schedule 07.02.2013
comment
спасибо. есть ли пример использования класса InMemoryRequestHandler для обработки сообщений ldap от клиентов? Я скачал пакет unboundid-ldapsdk-2.3.1-se, он где-то есть? - person Igor Delac; 08.02.2013
comment
com.unboundid.ldap.listener.InMemoryDirectoryServer должен быть всем необходимым для этого примером. Полный исходный код LDAP SDK находится в файле src.zip, содержащемся в загружаемом файле. - person Neil Wilson; 08.02.2013
comment
Ты прав. Похоже, что в самом начале в конструкторе класса InMemoryDirectoryServer.java есть эта строка: inMemoryHandler = new InMemoryRequestHandler(config); Это означает, что нет способа заставить экземпляр InMemoryDirectoryServer использовать собственный обработчик, если только Я меняю исходный код библиотеки. Верно? - person Igor Delac; 10.02.2013
comment
Вам определенно не следует изменять код для InMemoryDirectoryServer. Это одноцелевой класс, предназначенный только для использования в качестве внешнего интерфейса для InMemoryRequestHandler. Если вы хотите использовать другой обработчик запросов, создайте свой собственный LDAPListener и сделайте так, чтобы он ссылался на нужный обработчик запросов. Это очень простой процесс, для которого требуется всего несколько строк кода. - person Neil Wilson; 11.02.2013