Я использую 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.
Дайте мне знать, если есть лучший способ сделать это. спасибо