Java 未绑定:如何封装processBindRequest返回值?
我正在为我的数据库构建一个LDAP接口。当客户端请求bind()时,它将在数据库中搜索并检查它是否有效Java 未绑定:如何封装processBindRequest返回值?,java,unboundid-ldap-sdk,Java,Unboundid Ldap Sdk,我正在为我的数据库构建一个LDAP接口。当客户端请求bind()时,它将在数据库中搜索并检查它是否有效 public class Main { LDAPListener listener ; Main() {} public static void main(String[] args) { Main main = new Main(); int port = main.StartServer(); try {
public class Main {
LDAPListener listener ;
Main() {}
public static void main(String[] args) {
Main main = new Main();
int port = main.StartServer();
try {
LDAPConnection cn = new LDAPConnection("localhost",port);
System.out.println("."+cn.isConnected()+" "+cn.getConnectedPort());
cn.bind("uid=user,ou=People,dc=example,dc=com", "pass");
cn.close();
main.StopServer();
} catch (Exception e){e.printStackTrace();
main.StopServer();}
}
public int StartServer() {
int listenPort = 0;
RequestHandler requestHandler = new RequestHandler();
LDAPListenerConfig config = new LDAPListenerConfig(listenPort, requestHandler);
listener = new LDAPListener(config);
try {
listener.startListening();
System.out.println(">port "+listener.getListenPort());
} catch (Exception e){System.out.println("e1> "+e.getMessage());}
return listener.getListenPort();
}
public void StopServer(){
System.out.println(">shutdown");
listener.shutDown(true);
}
}
然后,我修改LDAPListenerRequestHandler与数据库通信,将记录作为返回值:
class RequestHandler extends LDAPListenerRequestHandler {
@Override
public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
List<Control> arg2) {
String uid = arg1.getBindDN();
String pass = arg1.getSimplePassword();
System.out.println(">bind: "+ uid);
// Database query: SELECT * FROM user WHERE username='uid' AND password='pass'
// Get the record as return value
return null;
}
}
我认为,这是由返回null的processBindRequest()引起的。如何将我的数据库记录封装为该进程中的LDAPMessage?您认为processBindRequest方法必须返回非空响应是正确的 如果绑定成功(用户存在,被允许进行身份验证,并且提供了正确的凭据),则可以使用以下代码创建成功响应:
@Override()
public LDAPMessage processBindRequest(final int messageID,
final BindRequestProtocolOp request,
final List<Control> controls)
{
return new LDAPMessage(messageID,
new BindResponseProtocolOp(ResultCode.SUCCESS_INT_VALUE,
null, // No matched DN is needed
null, // No diagnostic message is needed
null, // No referral URLs are needed
null), // No server SASL credentials are needed
Collections.<Control>emptyList()); // Add empty list to return
}
@Override()
公共LDAPMessage processBindRequest(最终int messageID,
最终BindRequestProtocolOp请求,
最终清单(控制措施)
{
返回新的LDAPMessage(messageID,
新BindResponseProtocolOp(ResultCode.SUCCESS\u INT\u值,
null,//不需要匹配的DN
null,//不需要任何诊断消息
null,//不需要引用URL
null),//不需要服务器SASL凭据
Collections.emptyList());//添加要返回的空列表
}
如果身份验证未成功,则您可能应该返回一个响应,其结果代码为无效的\u凭据,而不是成功。如果您希望向客户端提供一条消息,其中包含绑定失败的原因,您可以将其放入诊断消息元素。谢谢您的回答。在编辑processBindRequest()之后,我仍然会得到相同的错误ResultCode=80I建议您启用调试日志记录(如com.unboundd.util.debug类中所述),并查看引发异常的位置和原因。由于您尚未提供所使用的完整代码,因此很难知道具体问题是什么。
@Override()
public LDAPMessage processBindRequest(final int messageID,
final BindRequestProtocolOp request,
final List<Control> controls)
{
return new LDAPMessage(messageID,
new BindResponseProtocolOp(ResultCode.SUCCESS_INT_VALUE,
null, // No matched DN is needed
null, // No diagnostic message is needed
null, // No referral URLs are needed
null), // No server SASL credentials are needed
Collections.<Control>emptyList()); // Add empty list to return
}