我使用来自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回复或结果。
让我知道是否有更好的方法来做到这一点。谢谢
thx。有没有例子说明如何使用InMemoryRequestHandler类来处理来自客户端的ldap消息?我下载了unboundid-ldapsdk-2.3.1-se软件包,它在哪里? –
com.unboundid.ldap.listener.InMemoryDirectoryServer应该是您需要的所有示例。下载中包含的src.zip文件提供了LDAP SDK的完整源代码。 –
你说得对。它看起来像在InMemoryDirectoryServer.java类的构造函数的最开始是这一行:_inMemoryHandler = new InMemoryRequestHandler(config); _这意味着没有办法强制InMemoryDirectoryServer实例使用自定义处理程序,除非我更改库的源代码。对? –