Hallo zusammen,
ich versuche gerade einen Server von Basis-Authentifizierung auf WS-Security umzustellen.
Derzeit steht noch in meiner web.xml
plus die ganzen definierten und erlaubten Rollen jeweils an den einzelnen services.
So weit so gut.
Ich würde das gerne auf WS-Security umstellen, da in meiner Anwendung mir der derzeit verwendete Authenticator (mit genutzer Authenticator.setDefault()-Methode) mächtig ein Bein stellt.
Hintergrund: Ich habe eine Eclipse RCP-Anwendung, für die das im Applikation-Scope ganz ok ist, aber ich möchte sie in eine RAP-Anwendung überführen. Dort können sich potentiell verschiedene Leute mit jeweils eigener Session anmelden.
Das Problem ist, dass die Anwendung als solche nur in einer Instanz läuft.
Logt sich der erste ein und gibt nur für für seine Session sichtbar seine Login-Daten ein. Die Anwendung baut eine Verbindung zum Web-Service auf und alles geht soweit.
Eine zweite Person macht das auch. Da aber der Authenticator aus Authenticator.setDefault() gecachet wird, wird auch für diese Person noch immer die Authentifizierung des ersten Verwendet.
Könnt ihr mir sagen, wie ich den realm, der derzeit für die Basis-Authentifizierung quasi transparent auf WS-Security einstellen kann?
Was ist Client-seitig noch nötig, um es dort auch zu verwenden (abgesehen davon, den Authenticator ins Nirvana zu jagen)?
Ich hatte mal Quellcode wie diesen hier beim Googles gefunden:
wobei der UsernameTokenHandler ungefähr so aussehen könnte
Danke im voraus! Ich finde das Thema gerade zum kotzen doof!
Daniel
ich versuche gerade einen Server von Basis-Authentifizierung auf WS-Security umzustellen.
Derzeit steht noch in meiner web.xml
Code:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>login_settings_realm</realm-name>
</login-config>
So weit so gut.
Ich würde das gerne auf WS-Security umstellen, da in meiner Anwendung mir der derzeit verwendete Authenticator (mit genutzer Authenticator.setDefault()-Methode) mächtig ein Bein stellt.
Hintergrund: Ich habe eine Eclipse RCP-Anwendung, für die das im Applikation-Scope ganz ok ist, aber ich möchte sie in eine RAP-Anwendung überführen. Dort können sich potentiell verschiedene Leute mit jeweils eigener Session anmelden.
Das Problem ist, dass die Anwendung als solche nur in einer Instanz läuft.
Logt sich der erste ein und gibt nur für für seine Session sichtbar seine Login-Daten ein. Die Anwendung baut eine Verbindung zum Web-Service auf und alles geht soweit.
Eine zweite Person macht das auch. Da aber der Authenticator aus Authenticator.setDefault() gecachet wird, wird auch für diese Person noch immer die Authentifizierung des ersten Verwendet.
Könnt ihr mir sagen, wie ich den realm, der derzeit für die Basis-Authentifizierung quasi transparent auf WS-Security einstellen kann?
Was ist Client-seitig noch nötig, um es dort auch zu verwenden (abgesehen davon, den Authenticator ins Nirvana zu jagen)?
Ich hatte mal Quellcode wie diesen hier beim Googles gefunden:
Java:
BindingProvider prov = (BindingProvider) port;
List<Handler> handlerChain = prov.getBinding().getHandlerChain();
handlerChain.add(new UsernameTokenHandler());
prov.getBinding().setHandlerChain(handlerChain);
prov.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
wsdlUrl.getPath());
Java:
public class UsernameTokenHandler implements
SOAPHandler<SOAPMessageContext> {
// +++
// TAKEN FROM ORIGINAL com.sun.xml.wss.XWSSConstants
// [url]http://fisheye5.cenqua.com/browse/xwss/xwss-ri/src/com/sun/xml/wss/XWSSConstants.java?hb=true[/url]
/* Properties used for Programmatic Login */
public static final String USERNAME_PROPERTY = "username";
public static final String PASSWORD_PROPERTY = "password";
/* Properties for Programmatic Certificate and PrivateKey */
public static final String CERTIFICATE_PROPERTY = "certificate";
public static final String PRIVATEKEY_PROPERTY = "privatekey";
public static final String SERVER_CERTIFICATE_PROPERTY = "server-certificate";
// ---
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isOutbound = (Boolean) context
.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutbound.booleanValue()) {
context.put(USERNAME_PROPERTY, "");
context.put(PASSWORD_PROPERTY, "");
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public void close(MessageContext context) {
}
}
Danke im voraus! Ich finde das Thema gerade zum kotzen doof!
Daniel