UnboundIDSDKのInMemoryDirectoryServerを使用しています。LDAPクライアントからのLDAP要求を処理するにはどうすればよいですか?
これが私が見つけたコードです(UnboundIDでDNとパスワードを取得する方法で):
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(final SearchResultEntry e:entryList)
関数のループ:
パブリック同期LDAPMessageprocessSearchRequest(final int messageID、final SearchRequestProtocolOp request、final List Controls){
このコードで:
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応答や結果はアラートできません。
これを行うためのより良い方法があるかどうか私に知らせてください。ありがとう