如何使用UnboundID获取DN和密码

时间:2012-09-26 07:30:28

标签: java ldap openldap unboundid-ldap-sdk

我需要一些关于UnboundID的帮助。我听说这是一个很好的选择,但我并不习惯。

所以我需要创建一个LDAP监听器。在这个监听器上,我应该能够捕获绑定请求(例如来自ldap浏览器)。我想知道如何获得DN和密码。这是我的LDAP监听器代码:

    public ResultCode CreateLdapServer () throws LDAPException {
       CannedResponseRequestHandler requestHandler = new CannedResponseRequestHandler();
    LDAPListenerConfig config =
             new LDAPListenerConfig(4243, requestHandler);
      try
      {
        config.setListenAddress(
             InetAddress.getByName("localhost"));
      }
      catch (final Exception e)
      {
        System.err.println("Unable to create the listen server.");
        return ResultCode.PARAM_ERROR;
      }

    listener = new LDAPListener(config);

    try
    {
      listener.startListening();
      System.out.println("Serveur is listening ...");
    }
    catch (final Exception e)
    {
        System.err.println("Unable to start listening.");
      return ResultCode.LOCAL_ERROR;
    }
    return ResultCode.SUCCESS;
}

public static void main(String[] args) throws LDAPException {
    MyConnection connect = new MyConnection();
    connect.CreateLdapServer();
}

我阅读了很多UnboundID文档,但我找不到任何我需要的简单示例。

另外,我不太确定CannedResponseRequestHandler的实用程序。我需要什么,这还够吗?

另一个问题:我不确定,但我觉得我的服务器没有监听或者我没有抓到任何东西(当我连接ldap浏览器时,没有发生任何事情)。任何想法/建议?

谢谢,祝你有愉快的一天!

编辑:感谢xhochy,我能够抓住密码和用户名。正如他所说,我将LDAPListenerRequestyHandler子类化为覆盖,首先是newInstance,然后是ProcessBindRequest。这是代码(它绝对不完美,它仍然是一个开始)。

公共类MyConnection {

private LDAPListener listener;

public MyConnection(){
}

public ResultCode CreateLdapServer() throws LDAPException {
    MyLDAPListenerRequestHandler requestHandler = new MyLDAPListenerRequestHandler();
    LDAPListenerConfig config =
             new LDAPListenerConfig(4243, requestHandler);
      try
      {
        config.setListenAddress(
             InetAddress.getByName("localhost"));
      }
      catch (final Exception e)
      {
        System.err.println("Unable to create the listen server.");
        return ResultCode.PARAM_ERROR;
      }

    listener = new LDAPListener(config);

    try
    {
      listener.startListening();
      System.out.println("Serveur is listening ...");
    }
    catch (IOException e)
    {
        System.err.println("Unable to start listening.");
      return ResultCode.LOCAL_ERROR;
    }


    return ResultCode.SUCCESS;
}

public static void main(String[] args) throws LDAPException {
    MyConnection connect = new MyConnection();
    connect.CreateLdapServer();
}

}

然后是LDAPListenerRequestHandler的子类:

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;
}

}

再次感谢!

2 个答案:

答案 0 :(得分:2)

您应该继承LDAPListenerRequestHandler并实施processBindRequest。您要查找的所有信息都包含在BindRequestProtocolOp中(processBindRequest的第二个参数)。为所有其他抽象方法添加一个空实现。

如果requestBindRequestProtocolOp个实例,那么您可以通过以下方式获取您的信息:

String username = request.getBindDN();
ByteString password = request.getSimplePassword();

答案 1 :(得分:2)

许多LDAP服务器实现不会返回密码,许多不会返回您可以使用的密码。 (也就是哈希)。

我很好奇为什么有理由退回密码。

-Jim