Поскольку в моем приложении BlackBerry, по-видимому, невозможно выполнить аутентификацию с помощью LDAP, я пытаюсь использовать своего рода обходной путь.Вместо аутентификации непосредственно на сервере LDAP я хочу использовать промежуточный веб-сервис.Вот так это выглядит
App --calls--> Web Service --calls--> LDAP Server
Таким образом, веб-служба должна взять имя пользователя и пароль, указанные в Приложении, и отправить их на сервер LDAP.Если это возможно, войдите в систему, веб-служба получает TRUE в качестве ответа и передает его в приложение.
Вот как это должно работать.Но в тот момент, когда я вызываю веб-сервис из приложения, я получаю следующую ошибку:
SoapFault - faultcode: 'S:Server' faultstring:
'java.lang.NullPointerException' faultactor: 'null' detail:
org.kxml2.kdom.Node@21e05a11
Похоже, проблема с сервером, но я нене знаю где: (
Ну, это веб-служба, которую я использую:
import javax.ejb.Stateless;
import javax.jws.WebService;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
@Stateless
@WebService()
public class ldapServiceBean implements ldapService {
@Override
public String error() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean ldapLogin(String username, String password) {
int ldapPort = LDAPConnection.DEFAULT_PORT;
int ldapVersion = LDAPConnection.LDAP_V3;
String ldapHost = "dc1.somehost ";
String loginDN =
"CN="+username+",OU=employee,OU=user,DC=somehost";
byte[] passwordBytes = password.getBytes();
LDAPConnection lc = new LDAPConnection();
try {
// connect to the server
lc.connect( ldapHost, ldapPort );
// authenticate to the server
lc.bind( ldapVersion, loginDN, passwordBytes );
System.out.println("Bind successful");
return true;
}
catch( LDAPException e ) {
if ( e.getResultCode() == LDAPException.NO_SUCH_OBJECT ) {
System.err.println( "Error: No such entry" );
} else if ( e.getResultCode() ==
LDAPException.NO_SUCH_ATTRIBUTE ) {
System.err.println( "Error: No such attribute" );
} else {
System.err.println( "Error: " + e.toString() );
}
}
return false;
}
И это метод, вызывающий веб-службу
private static final String SOAP_ACTION = "";
private static final String METHOD_NAME = "ldapLogin";
private static final String NAMESPACE = "http://ldapproxy.somehost/";
private static final String URL = "http://myIP:8080/LDAPProxy/ldapServiceBeanService";
...
public boolean login(String username, String password) {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//SoapObject
request.addProperty("username", username);
request.addProperty("password", password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//envelope.dotNet = true;
//envelope.bodyOut = request;
envelope.setOutputSoapObject(request);
HttpTransport httpTransport = new HttpTransport(URL);
try
{
httpTransport.call(SOAP_ACTION, envelope);
System.out.println("request: " + httpTransport.requestDump);
resultsRequestSOAP = (SoapObject) envelope.getResponse();
return true;
}catch(SoapFault sF){
String error = sF.toString();
Dialog.alert(error);
}
catch (Exception aE)
{
Dialog.alert("Connection failed");
aE.printStackTrace ();
}
return false;
}
Что яДо сих пор выяснилось: кажется, что веб-сервис не получает свойства имени пользователя и пароля. Когда я их распечатываю, я получаю:
`CN=null, OU=employee, OU=...`
Как я читал в этом посте Получает веб-сервиснулевые параметры из приложения с использованием метода ksoap кажется, что у ksoap есть проблема с двоеточиями. Я изменил NAMESPACE, но безуспешно. Возможно, мне тоже нужно изменить URL-адрес. Но как мне это сделать, пока мне все еще нужно использовать localhost