2014-01-16 3 views
0

데이터베이스의 LDAP 인터페이스를 구축 중입니다. 클라이언트가 bind() 요청을하면 데이터베이스를 검색하여 유효한지 확인합니다.UnboundID : processBindRequest 반환 값을 캡슐화하는 방법?

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; 
    } 
} 

내가 그것을 실행하면, 난 바인드 줄에서 오류 메시지가 있어요 :

LDAPException(resultCode=80 (other), errorMessage='An unexpected exception was thrown while attempting to process the requested operation: NullPointerException(trace='run(LDAPListenerClientConnection.java:461)', revision=15579)', diagnosticMessage='An unexpected exception was thrown while attempting to process the requested operation: NullPointerException(trace='run(LDAPListenerClientConnection.java:461)', revision=15579)') 
    at com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:1881) 
    at com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:1799) 

나는 그것이 null을 반환 processBindRequest()에 의해 발생합니다 생각합니다. 해당 프로세스에서 LDAPMessage로 데이터베이스 레코드를 캡슐화하는 방법은 무엇입니까?

답변

0

processBindRequest 메서드가 null이 아닌 응답을 반환해야한다는 것이 맞습니다. 인증이 실패하면

@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 
} 

:

바인드가 성공하면

는 다음과 같은 코드로 성공적인 응답을 생성 할 수 있습니다 (사용자는 인증이 허용 존재하고 올바른 자격 증명을 제공하고있다) , SUCCESS가 아닌 INVALID_CREDENTIALS의 결과 코드로 응답을 리턴해야하며, 바인드가 실패한 이유에 대한 정보로 클라이언트에 메시지를 제공하려면이를 진단 메시지 요소에 넣을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 편집 후 processBindRequest() 여전히 동일한 오류가 발생합니다. ResultCode = 80 – vladschwartz

+0

com.unboundid.util.Debug 클래스에 설명 된대로 디버그 로깅을 사용하고 예외 발생 위치를 확인하고 예외가 발생하는 것을 확인하는 것이 좋습니다. 사용중인 전체 코드를 제공하지 않았기 때문에 특정 문제가 무엇인지 알기가 어렵습니다. –