Java 未绑定:如何封装processBindRequest返回值?

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 {

我正在为我的数据库构建一个LDAP接口。当客户端请求bind()时,它将在数据库中搜索并检查它是否有效

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
 }