Beispiel: Angepasstes Anmeldemodul für Zuordnung eingehender Anforderungen
Dieses Beispiel beschreibt ein angepasstes Anmeldemodul, das eine java.util.Hashtable basierend auf dem angegebenen NameCallback erstellt. Die java.util.Hashtable wird sharedState java.util.Map hinzugefügt, damit die WAS-Anmeldemodule die Informationen in der Hashtabelle lokalisieren können.
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// (Weitere Informationen zur Initialisierung finden Sie im Abschnitt
// Angepasste Anmeldemodule für eine Systemanmeldekonfiguration für JAAS entwickeln.)
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// (Nähere Informationen zu den während der Anmeldung auszuführen Aktionen finden Sie im Artikel
// Angepasste Anmeldemodule für eine Systemanmeldekonfiguration für JAAS entwickeln.)
// Prüft mit WSTokenHolderCallback, ob es sich um eine
// Erstanmeldung oder eine Anmeldung durch Weitergabe handelt.
javax.security.auth.callback.Callback callbacks[] =
new javax.security.auth.callback.Callback[3];
callbacks[0] = new javax.security.auth.callback.NameCallback("");
callbacks[1] = new javax.security.auth.callback.PasswordCallback(
"Password: ", false);
callbacks[2] = new com.ibm.websphere.security.auth.callback.
WSCredTokenCallbackImpl("");
callbacks[3] = new com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback("");
try
{
callbackHandler.handle(callbacks);
}
catch (Exception e)
{
// Ausnahme behandeln
}
// Bestimmt, welche Callbacks Informationen enthalten
boolean identitySwitched = false;
String uid = ((NameCallback) callbacks[0]).getName();
char password[] = ((PasswordCallback) callbacks[1]).getPassword();
byte[] credToken = ((WSCredTokenCallbackImpl) callbacks[2]).getCredToken();
java.util.List authzTokenList = ((WSTokenHolderCallback) callbacks[3]).
getTokenHolderList();
if (credToken != null)
{
try
{
String uniqueID = WSSecurityPropagationHelper.validateLTPAToken(credToken);
String realm = WSSecurityPropagationHelper.getRealmFromUniqueID (uniqueID);
// Zeichenfolge auf die UID setzen, damit die Informationen für
// Zuordnung oder Anmeldung verwendet werden können
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
}
catch (Exception e)
{
// Behandlung der Ausnahme
}
}
else if (uid == null)
{
// Die Authentifizierungsdaten sind nicht gültig. Sie müssen
// die UID oder das CredToken angeben.
throw new WSLoginFailedException("invalid authentication data.");
}
else if (uid != null && password != null)
{
// Dies ist eine typische Authentifizierung. Sie können festlegen, dass diese ID einer anderen ID
// zugeordnet werden soll oder Sie können den Schritt überspringen und WebSphere Application Server
// die Anmeldung durchführen lassen. Wenn Kennwörter angegeben werden, achten Sie darauf,
// das Kennwort zu validieren, da es sich um die erste Authentifizierung handelt.
return true;
}
// Sie können diese UID nach Bedarf einem anderen Element zuordnen und identitySwitched
// boolean setzen. Wenn die Identität geändert wurde, löschen Sie die folgenden
// weitergegebenen Attribute, damit sie nicht falsch verwendet werden.
uid = myCustomMappingRoutine (uid);
// Weitergeleitete Attribute löschen, weil sie für die neue Identität nicht mehr gültig sind
if (identitySwitched)
{
((WSTokenHolderCallback) callbacks[3]).setTokenHolderList(null);
}
boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback) callbacks[2]).getRequiresLogin();
if (requiresLogin || identitySwitched)
{
// Standard-InitialContext für den Server abrufen
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
// Lokales UserRegistry-Objekt abrufen
com.ibm.websphere.security.UserRegistry reg =
(com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");
// Ruft die uniqueID der Registry ab, die auf dem im
// NameCallback angegebenen Benutzer-ID basiert.
String uniqueid = reg.getUniqueUserId(uid);
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
// Ruft den auf der uniqueID basierenden Anzeigenamen von der Benutzerregistry ab.
String securityName = reg.getUserSecurityName(uid);
// Gruppen für diese eindeutige ID abrufen
java.util.List groupList = reg.getUniqueGroupIds(uid);
// Erstellt die java.util.Hashtable mit den Informationen, die Sie
// in der UserRegistry-Implementierung erfasst haben.
java.util.Hashtable hashtable = new java.util.Hashtable();
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_UNIQUEID, uniqueid);
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_SECURITYNAME, securityName);
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_GROUPS, groupList);
// Fügt einen Cacheschlüssel hinzu, der als Teil des Mechanismus für die Suche nach
// dem erstellten Subjekt verwendet wird. Der Cacheschlüssel kann ein Objekt sein,
// hat aber eine implementierte Methode toString. Vergewissern Sie
// sich, dass der cacheKey genügend Informationen enthält, um den Benutzer und alle
// weiteren verwendeten Attribute abzudecken. Wird diese Eigenschaft nicht angegeben,
// wird das Subject standardmäßig der zurückgegebenen WSCREDENTIAL_UNIQUEID zugeordnet.
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid);
// Hashtabelle dem gemeinsam genutzten Status des Subject hinzufügen
_sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_PROPERTIES_KEY, hashtable);
}
else if (requiresLogin == false)
{
// Weitere Informationen zu diesem Abschnitt finden Sie im Artikel
// Weitergabe von Sicherheitsattributen.
// Wenn Sie eine eigene Tokenimplementierung hinzugefügt haben, können
// Sie für die Entserialisierung die Liste der Tokenbesitzer durchsuchen.
// Anmerkung: Alle Java-Objekte werden automatisch vom
// wsMapDefaultInboundLoginModule entserialisiert.
for (int i=0; i<authzTokenList.size(); i++)
{
TokenHolder tokenHolder = (TokenHolder) authzTokenList.get(i);
if (tokenHolder.getName().equals("com.acme.MyCustomTokenImpl"))
{
byte[] myTokenBytes = tokenHolder.getBytes();
// Bytes zur Entserialisierung an den Konstruktor der
// Implementierungsklasse übergeben
com.acme.MyCustomTokenImpl myTokenImpl = new com.acme.MyCustomTokenImpl(myTokenBytes);
}
}
}
}
public boolean commit() throws LoginException
{
// (Weitere Informationen zu den während der Commit-Operation auszuführenden
// Aktionen finden Sie im Artikel Angepasste Anmeldemodule für eine Systemanmeldekonfiguration für JAAS entwickeln.)
}
// Variablen für das Anmeldemodul definieren
com.ibm.wsspi.security.token.AuthorizationToken customAuthzToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}