java - InMemoryDirectoryServer,处理请求(绑定(bind)、修改等)

标签 java ldap unboundid-ldap-sdk

我正在使用 UnboundID SDK 中的 InMemoryDirectoryServer。 如何处理来自 ldap 客户端的 ldap 请求?

这是我找到的代码(在 How to get DN and password with 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;
}

这是捕获绑定(bind)请求并处理它的正确方法

public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
        List<Control> arg2) {

功能? 处理完成后,我是否需要手动将bind发送到InMemoryDirectoryServer实例?

再次嗨,

基于: http://sourceforge.net/p/ldap-sdk/discussion/1001257/thread/796c129d

在我看来,可以修改 InMemoryRequestHandler 源并更改它回复 ldap 请求的方式(搜索、修改...)。

对于别名取消引用,我修改了

for (final SearchResultEntry e : entryList)

函数中的循环:

public synchronized LDAPMessage processSearchRequest(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 回复或结果。

请告诉我是否有更好的方法。谢谢

最佳答案

适用于 Java 的 UnboundID LDAP SDK 提供了一个 LDAPListener 框架,允许您创建自己的代码来接受来自客户端的 LDAP 请求并提供响应。当LDAPListener收到请求时,它使用LDAPListenerRequestHandler来处理请求并生成结果。

内存目录服务器使用 InMemoryRequestHandler 来执行此处理,但您可以创建自己的请求处理程序实现来执行您想要的任何操作(例如,CannedResponseRequestHandler 绑定(bind)地返回对任何请求的固定响应),并且您可以在委托(delegate)给另一个请求处理程序之前执行一些处理的请求处理程序(例如,AccessLogRequestHandler 和 LDAPDebuggerRequestHandler 实现拦截请求并将有关它们的信息写入日志文件,然后再将它们转发到另一个请求处理程序,然后拦截并记录有关响应的信息在将其返回给客户端之前;相反,ProxyRequestHandler 通过 LDAP 对另一个目录服务器进行处理。

如果您想提供自定义处理,那么您应该创建自己的 LDAPListenerRequestHandler 子类(正如您所假设的,processBindRequest 方法可用于执行绑定(bind)操作的处理)。如果该请求处理程序完成了操作的所有处理,那么您可以自己创建并返回响应。如果您只需要拦截请求并捕获有关它的信息,然后将其转发给其他真正执行处理的东西,那么您应该委托(delegate)给另一个请求处理程序。 LDAP SDK 中已有这两个示例,因此您可以将它们用作模型来创建您需要的内容。

关于java - InMemoryDirectoryServer,处理请求(绑定(bind)、修改等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14751343/

相关文章:

java-apns 与 http 代理问题

oauth - LDAP Provider over OpenID (Google OAuth) 后端

java - 没有凭据java的 Activity 目录身份验证

java - 以编程方式查询 LDAP 权限

java - SCIM 模式映射到 LDAP

java - 如何使用 UnboundID LDAP SDK 连接到本地主机?

java - 错误 : type List does not take parameters

java - 从具有所需目录名称的路径创建目录

java - 如何计算一次插入多少行,考虑mysql的max_allowed_pa​​cket

mysql - 将 RDBMS 与 Apache Directory Ldap 同步