2013-02-07 60 views
0

我使用来自UnboundID SDK的InMemoryDirectoryServer。 如何处理ldap客户端的ldap请求?InMemoryDirectoryServer,处理请求(绑定,修改等)

这里的代码,我发现(在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; 
} 

难道这捕获绑定传请求下

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

功能处理它一个适当的方式? 处理完后,我必须手动发送绑定到InMemoryDirectoryServer实例吗?

再次你好,根据

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

在我看来,这是可以修改InMemoryRequestHandler源,并改变它如何回答的LDAP请求(搜索,修改,...)。

对于别名废弃,我修改

为(最终SearchResultEntry E:entryList)

回路功能:

公共同步LDAPMessage processSearchRequest(最终诠释 MESSAGEID, final SearchRequestProtocolOp请求, final List控制){

与此代码:

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回复或结果。

让我知道是否有更好的方法来做到这一点。谢谢

回答

1

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

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

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

+0

thx。有没有例子说明如何使用InMemoryRequestHandler类来处理来自客户端的ldap消息?我下载了unboundid-ldapsdk-2.3.1-se软件包,它在哪里? –

+1

com.unboundid.ldap.listener.InMemoryDirectoryServer应该是您需要的所有示例。下载中包含的src.zip文件提供了LDAP SDK的完整源代码。 –

+0

你说得对。它看起来像在InMemoryDirectoryServer.java类的构造函数的最开始是这一行:_inMemoryHandler = new InMemoryRequestHandler(config); _这意味着没有办法强制InMemoryDirectoryServer实例使用自定义处理程序,除非我更改库的源代码。对? –