-1

ポート(6666)でリッスンするJavaサーバーを構築しました。ここで、LDAPブラウザを使用してこのサーバーに接続する必要があります(私はSofterraを使用しています)。接続は完了しましたが、LDAPバインド/検索がいつあるかを知る必要があり、その方法がわかりません。

これが私のサーバーのコードです(それがあまり明確でない/良くない場合は、遠慮なく教えてください。私はJava Progにまったく慣れていません):

package net.nantes.littleldap;
import java.net.*;
import java.io.*;

public class Serverside {

    public static void main(String[] args) {
        ServerSocket socketserver  ;
        Socket socket ;
        BufferedReader in;
        PrintWriter out;

        try {
            Authenticate auth = new Authenticate();
            socketserver = new ServerSocket(6666);
            System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());
            auth.connect();
            socket = socketserver.accept(); 
            String inputLine = new String();
            in = new BufferedReader(
                        new InputStreamReader(
                        socket.getInputStream()));
                System.out.println("Connecté au serveur");
                while ((inputLine = in.readLine()) != null){
                    System.out.println(inputLine);
                out = new PrintWriter(socket.getOutputStream());
                out.println("Connection réussie");
                out.flush();
                }
                socket.close();
                socketserver.close();

        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

申し訳ありませんが、メッセージはフランス語ですが、それほど重要ではありません。InputLineで何かできると思います(印刷すると、LDAPに関連する文字列が返されますが、解析が難しい場合があります)。

だから、何かアイデアはありますか?どうもありがとう !

4

3 に答える 3

1

JNDIまたは利用可能なLDAPSDKのいずれかを利用することを強くお勧めします。私たちは好きです:https : //www.unboundid.com/products/ldap-sdk/ -jim

于 2012-09-12T12:47:16.383 に答える
0

UnboundIDLDAPSDKといくつかのサンプルコードを確認してください。

編集:

JNDIの使用はお勧めしません。

  • JNDIは非推奨の構成を使用します
  • JNDIにソフトウェアの欠陥があります
  • JNDIはLDAP標準を完全にはサポートしていません

も参照してください

于 2012-09-11T16:05:26.927 に答える
0

ポートをリッスンすることに加えて、サーバーはLDAPプロトコルを「理解」する必要があります。OpenDS LDAP SDK(http://www.middleware.vt.edu/pubs/opends-sdk-0.9.0/)を使用しています。

コードはこんな感じ

public class MyLdapServer 
implements ServerConnectionFactory<LDAPClientContext, Integer> {

private LDAPListener listener;

public void init() {
    try {
        listener = new LDAPListener(1389, this);
    } catch (IOException e) {
        logger.error("error opening LDAP listener", e);
    }
}

public void destroy() {
   listener.close();
}

@Override
public ServerConnection<Integer> handleAccept(LDAPClientContext context)
        throws ErrorResultException {
    if (logger.isDebugEnabled())
        logger.debug("ldap connection from: " + context.getPeerAddress());

    IncomingLdapConnection ilc = new IncomingLdapConnection(context);
    return ilc;
}

private static Logger logger = LoggerFactory.getLogger(MyLdapServer.class);

}

IncomingLdapConnectionを使用すると、LDAP操作を処理できます。

public class IncomingLdapConnection 
implements ServerConnection<Integer> {

    public void handleBind(Integer ctx, int version, BindRequest request,
        ResultHandler<? super BindResult> resultHandler,
        IntermediateResponseHandler intermediateResponseHandler)
throws UnsupportedOperationException {
    if (request.getAuthenticationType() != -128) {
        logger.warn("LDAP BIND: unsupported authentication type: " + request.getAuthenticationType());
        resultHandler.handleResult(Responses.newBindResult(ResultCode.AUTH_METHOD_NOT_SUPPORTED));
        return;
    }

    String bindName = request.getName();
    if (bindName.length() > 0) {
        if (request instanceof GenericBindRequest) {
            GenericBindRequest bindRequest = (GenericBindRequest)request;

            String userName = parseUidDn(bindName);
            if (userName == null) {
                // manche LDAP-Clients senden keine DN, sondern direkt den Namen
                userName = bindName;
            }

            String password = bindRequest.getAuthenticationValue().toString();

            logger.debug("LDAP BIND: non-anonymous bind, user = " + userName);
            anonymous = false;
        } else {
            logger.warn("LDAP BIND: non-anonymous bind, but unsupported request");
            resultHandler.handleResult(Responses.newBindResult(ResultCode.AUTH_METHOD_NOT_SUPPORTED));
            return;
        }
    } else {
        logger.debug("LDAP BIND: anonymous bind");
        anonymous = true;
    }

    boolean success = anonymous;
    if (!anonymous) {
        // authenticate user, set "success"
    }

    if (success)
        resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS));
    else
        resultHandler.handleResult(Responses.newBindResult(ResultCode.INVALID_CREDENTIALS));

    authenticated = success;
}

編集:LDAP検索要求に応答するためのOpenDSコード

public void handleSearch(Integer ctx, SearchRequest request,
        SearchResultHandler responseHandler, IntermediateResponseHandler intermediateResponseHandler)
    throws UnsupportedOperationException {
    if (request.getScope() == SearchScope.BASE_OBJECT && request.getName().isRootDN()) {
        logger.debug("LDAP Search: BASE_OBJECT");
        responseHandler.handleEntry(Responses.newSearchResultEntry(rootEntry));
    } else {
        // do the search
        // parameters: request.getName(), request.getScope(), request.getFilter()
    }

    responseHandler.handleResult(Responses.newResult(ResultCode.SUCCESS));
}
于 2012-09-11T16:12:26.360 に答える