0

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応答や結果はアラートできません。

これを行うためのより良い方法があるかどうか私に知らせてください。ありがとう

4

1 に答える 1

1

UnboundID LDAP SDK for Java は LDAPListener フレームワークを提供します。このフレームワークを使用すると、クライアントからの LDAP 要求を受け入れ、それらに応答を返すことができる独自のコードを作成できます。LDAPListener は、リクエストを受け取ると、LDAPListenerRequestHandler を使用してリクエストを処理し、結果を生成します。

インメモリ ディレクトリ サーバーは InMemoryRequestHandler を使用してこの処理を実行しますが、任意の処理を実行する独自の要求ハンドラー実装を作成できます (たとえば、CannedResponseRequestHandler は任意の要求に対して固定応答をバインドして返します)。また、要求ハンドラーを持つことができます。これは、別のリクエスト ハンドラに委譲する前に何らかの処理を行います (たとえば、AccessLogRequestHandler および LDAPDebuggerRequestHandler の実装は、リクエストをインターセプトし、別のリクエスト ハンドラに転送する前にそれらに関する情報をログ ファイルに書き込みます。次に、レスポンスに関する情報をインターセプトしてログに記録してから、それを返します)。逆に、ProxyRequestHandler は LDAP を介して別のディレクトリ サーバーに対して処理を行います)。

カスタム処理を提供したい場合は、独自の LDAPListenerRequestHandler サブクラスを作成する必要があります (想定どおり、バインド操作の処理を実行するために processBindRequest メソッドを使用できます)。そのリクエスト ハンドラーが操作のすべての処理を行う場合は、自分でレスポンスを作成して返すことができます。実際に処理を実行する別のものに転送する前に、要求をインターセプトしてその情報を取得する必要がある場合は、別の要求ハンドラーに委任する必要があります。LDAP SDK には両方の例が既に含まれているため、それらをモデルとして使用して、必要なものを作成できます。

于 2013-02-07T18:01:03.110 に答える