Beispiel: HTTP-Cookie abrufen
Das folgende Beispiel zeigt, wie Sie ein Cookie aus einer HTTP-Anforderung abrufen, das Cookie in die ursprünglichen Bytes decodieren und aus diesen Bytes ein eigenes SingleSignonToken-Objekt erstellen. Das Beispiel beschreibt die Ausführung dieser Schritte in einem Anmeldemodul. Sie können aber auch ein Servlet verwenden.
Informationen zu den Aktionen während der Anmeldung und der Festschreibung finden Sie unter Angepasste Anmeldemodule für eine Systemanmeldekonfiguration für JAAS entwickeln.
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// Prüft mit WSTokenHolderCallback, ob es sich um eine
// Erstanmeldung oder eine Anmeldung durch Weitergabe handelt.
Callback callbacks[] = new Callback[2];
callbacks[0] = new WSTokenHolderCallback("Authz Token List: ");
callbacks[1] = new WSServletRequestCallback("HttpServletRequest: ");
try
{
callbackHandler.handle(callbacks);
}
catch (Exception e)
{
// Ausnahme behandeln
}
// Empfängt die ArrayList von TokenHolder-Objekten (die serialisierten Token)
List authzTokenList = ((WSTokenHolderCallback) callbacks[0]).getTokenHolderList();
javax.servlet.http.HttpServletRequest request =
((WSServletRequestCallback) callbacks[1]).getHttpServletRequest();
if (request != null)
{
// Prüft, ob das Cookie vorhanden ist
javax.servlet.http.Cookie[] cookies = request.getCookies();
String[] cookieStrings = getCookieValues (cookies, "myCookeName1");
if (cookieStrings != null)
{
String cookieVal = null;
for (int n=0;n<cookieStrings.length;n++)
{
cookieVal = cookieStrings[n];
if (cookieVal.length()>0)
{
// Codiertes Cookie in Bytefolge
// konvertieren
byte[] cookieBytes =
com.ibm.websphere.security.WSSecurityHelper.
convertCookieStringToBytes(cookieVal);
customSSOToken = new com.ibm.websphere.security.token.
CustomSingleSignonTokenImpl(cookieBytes);
// Sie haben das Cookie aus der Anforderung abgerufen
// und können es jetzt bearbeiten oder
// für spätere Verwendung dem Subject in der Methode
// hinzufügen
if (debug || tc.isDebugEnabled())
{
System.out.println("*** GOT MY CUSTOM SSO TOKEN FROM
THE REQUEST ***");
}
}
}
}
}
}
public boolean commit() throws LoginException
{
if (customSSOToken != null)
{
// Legt das customSSOToken-Token im Subject fest
try
{
public final SingleSignonToken customSSOTokenPriv = customSSOToken;
// Fügen Sie dies in einen doPrivileged-Codeblock ein, damit der
// Anwendungscode keine weiteren Berechtigungen hinzufügen muss.
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction()
{
public Object run()
{
try
{
// Fügt das angepasste SSO-Token hinzu, falls
// es nicht null und noch nicht im Subject enthalten ist.
if ((customSSOTokenPriv != null) &&
(!subject.getPrivateCredentials().
contains(customSSOTokenPriv)))
{
subject.getPrivateCredentials().add(customSSOTokenPriv);
}
}
catch (Exception e)
{
throw new WSLoginFailedException (e.getMessage(), e);
}
return null;
}
});
}
catch (Exception e)
{
throw new WSLoginFailedException (e.getMessage(), e);
}
}
}
// Private Methode, um das Cookie aus der Anforderung abzurufen
private String[] getCookieValues (Cookie[] cookies, String hdrName)
{
Vector retValues = new Vector();
int numMatches=0;
if (cookies != null)
{
for (int i = 0; i < cookies.length; ++i)
{
if (hdrName.equals(cookies[i].getName()))
{
retValues.add(cookies[i].getValue());
numMatches++;
System.out.println(cookies[i].getValue());
}
}
}
if (retValues.size()>0)
return (String[]) retValues.toArray(new String[numMatches]);
else
return null;
}
// Variablen für das Anmeldemodul definieren
com.ibm.wsspi.security.token.SingleSignonToken customSSOToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}