我正在使用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;
}
这是捕获绑定请求并在
下处理它的正确方法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)
循环功能:
public synchronized LDAPMessage processSearchRequest(final int MESSAGEID, 最终的SearchRequestProtocolOp请求, 最终列表控件){
使用此代码:
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回复或结果。
如果有更好的方法,请告诉我。感谢
答案 0 :(得分:1)
UnboundID LDAP SDK for Java提供了一个LDAPListener框架,允许您创建自己的代码,接受来自客户端的LDAP请求,并可以向他们提供响应。当LDAPListener收到请求时,它使用LDAPListenerRequestHandler来处理请求并生成结果。
内存中目录服务器使用InMemoryRequestHandler来执行此处理,但您可以创建自己的请求处理程序实现,它可以执行您想要的任何操作(例如,CannedResponseRequestHandler绑定地返回对任何请求的固定响应),并且您可以拥有请求处理程序在委托给另一个请求处理程序之前执行一些处理(例如,AccessLogRequestHandler和LDAPDebuggerRequestHandler实现拦截请求并将它们的信息写入日志文件,然后将它们转发到另一个请求处理程序,然后拦截并记录有关响应的信息在将其返回给客户端之前;相反,ProxyRequestHandler通过LDAP对另一个目录服务器进行处理。)
如果要提供自定义处理,则应创建自己的LDAPListenerRequestHandler子类(如您所愿,可以使用processBindRequest方法执行绑定操作的处理)。如果该请求处理程序执行了该操作的所有处理,那么您可以自己创建并返回响应。如果您只需要拦截请求并捕获有关它的信息,然后再转发给真正执行处理的其他内容,那么您应该委托给另一个请求处理程序。 LDAP SDK中已有两个示例,因此您可以将它们用作模型来创建所需内容。