Sie können einen angepassten
Java™ Authentication SPI for Containers (JASPIC)-Authentifizierungsprovider entwickeln,
indem Sie Klassen erstellen, die die erforderlichen in der JSR 196 (Java Specification Request) für die Spezifikation
"Java Authentication Service Provider Interface for Containers"
aufgeführten Schnittstellen implementieren.
Informationen zu diesem Vorgang
WebSphere Application Server Liberty Profile unterstützt die Verwendung von Authentifizierungsprovidern anderer Anbieter, die mit dem in
Java Authentication SPI for Containers (JASPIC) Version 1.1 definierten Servlet-Container-Profil kompatibel sind.
Das Servlet-Container-Profil definiert Schnittstellen, die von der Sicherheitslaufzeitumgebung in Zusammenarbeit mit dem Web-Container in WebSphere Application Server verwendet werden, um Authentifizierungsmodule aufzurufen, bevor und nachdem eine Webanforderung von einer Anwendung verarbeitet wird. Eine Authentifizierung mit JASPIC-Modulen wird nur ausgeführt, wenn JASPIC in der Sicherheitskonfiguration aktiviert ist.
Wenn Sie einen angepassten Authentifizierungsprovider entwickeln möchten, erstellen Sie
Klassen, die die erforderlichen, in der JSR 196 (Java Specification Request) für die Spezifikation "Java Authentication Service Provider Interface for Containers"
aufgeführten Schnittstellen implementieren. Ein Provider kann ein oder mehrere Authentifizierungsmodule für die Authentifizierung verwenden. Module können Callbacks verwenden, um die Authentifizierung durchzuführen, oder sie können die notwendigen Benutzeridentitätsinformationen dem Clientsubjekt manuell hinzufügen.
- Erstellen Sie eine Klasse, die die Schnittstelle javax.security.auth.message.config.AuthConfigProvider implementiert.
Die Implementierungsklasse
AuthConfigProvider muss einen öffentlichen, aus zwei Argumenten bestehenden Konstruktor und die öffentliche Methode
getServerAuthConfig definieren:
import java.util.Map;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.config.AuthConfigFactory;
import javax.security.auth.message.config.AuthConfigProvider;
import javax.security.auth.message.config.ServerAuthConfig;
public class SampleAuthConfigProvider implements AuthConfigProvider {
public SampleAuthConfigProvider(Map<String, String> properties, AuthConfigFactory factory) {
...
}
public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler)
throws AuthException {
...
}
}
Eine Instanz der Implementierungsklasse AuthConfigProvider wird von WebSphere Application Server verwendet,
wenn eine Anforderung zur Verarbeitung durch das Webmodul der Anwendung eingeht. Die Methode getServerAuthConfig wird verwendet,
um eine ServerAuthConfig-Instanz abzurufen. Das Argument CallbackHandler
in der Methode wird vom Modul authentication verwendet.
- Erstellen Sie eine Klasse, die die Schnittstelle javax.security.auth.message.config.ServerAuthConfig implementiert.
Die Implementierungsklasse
ServerAuthConfig muss die öffentlichen Methoden
getAuthContextID und
getAuthContext definieren:
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.MessageInfo;
import javax.security.auth.message.config.ServerAuthConfig;
import javax.security.auth.message.config.ServerAuthContext;
public class SampleServerAuthConfig implements ServerAuthConfig {
public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
...
}
public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties)
throws AuthException {
...
}
}
Die Methoden getAuthContextID und getAuthContext
in der Implementierungsklasse ServerAuthConfig werden verwendet, um eine
ServerAuthContext-Instanz abzurufen.
- Erstellen Sie eine Klasse, die die Schnittstelle javax.security.auth.message.config.ServerAuthContext
implementiert.
Die Implementierungsklasse
ServerAuthContext muss die öffentlichen Methoden
validateRequest und
secureResponse definieren:
import javax.security.auth.Subject;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.AuthStatus;
import javax.security.auth.message.MessageInfo;
import javax.security.auth.message.config.ServerAuthContext;
public class SampleServerAuthContext implements ServerAuthContext {
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
throws AuthException {
...
}
public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject)
throws AuthException {
...
}
}
Die Methode validateRequest in der Implementierungsklasse ServerAuthContext
wird verwendet, um das Modul aufzurufen, das die empfangene Webanforderungsnachricht authentifiziert. Wenn die
Authentifizierung erfolgreich verlaufen ist, teilt der Web-Container die empfangene Webanforderungsnachricht zu,
die das Zielwebmodul in der Anwendung verarbeitet. Ist die Authentifizierung nicht erfolgreich verlaufen, wird die Anforderung mit dem entsprechenden Antwortstatus zurückgewiesen.
- Erstellen Sie eine Klasse, die die Schnittstelle javax.security.auth.message.module.ServerAuthModule implementiert.
Die Implementierungsklasse
ServerAuthModule muss
die öffentlichen Methoden
initialize,
validateRequest und
secureResponse definieren:
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.AuthStatus;
import javax.security.auth.message.MessageInfo;
import javax.security.auth.message.MessagePolicy;
import javax.security.auth.message.module.ServerAuthModule;
public class SampleAuthModule implements ServerAuthModule {
public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map options)
throws AuthException {
...
}
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
throws AuthException {
...
}
public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject)
throws AuthException {
...
}
public void cleanSubject(MessageInfo messageInfo, Subject subject)
throws AuthException {
...
}
}
Die Methode initialize in der Implementierungsklasse ServerAuthModule
wird von der Implementierungsklasse ServerAuthContext aufgerufen, um das Modul
authentication zu initialisieren und der ServerAuthContext-Instanz zuzuordnen.
Die Methoden
validateRequest und
secureResponse in dieser Klasse
werden verwendet, um die Schnittstellen
javax.servlet.http.HttpServletRequest und
javax.servlet.http.HttpServletResponse, die in der empfangenen
javax.security.auth.message.MessageInfo
enthalten sind, zu authentifizieren. Diese Methoden können die in der Methode
initialize empfangene
CallbackHandler-Instanz verwenden, um mit der WebSphere-Sicherheitslaufzeit zwecks Validierung eines Benutzerkennworts und mit der aktiven Benutzerregistry zwecks Abruf einer eindeutigen ID und eventueller Gruppenzugehörigkeiten eines Benutzers zu interagieren. Die abgerufenen Daten werden in eine
Hashtable in der Gruppe privater Berechtigungsnachweise im Clientsubjekt gestellt. Die WebSphere Application Server-Implementierung des
CallbackHandler unterstützt die folgenden drei Callbacktypen:
- • CallerPrincipalCallback
- • GroupPrincipalCallback
- • PasswordValidationCallback
WebSphere Application
Server erwartet, dass die Namenswerte, die mit den Methoden PasswordValidationCallback.getUsername() und CallerPrincipalCallback.getName() abgerufen werden, identisch sind. Ist das nicht der Fall,
treten unerwartete Ereignisse ein. Die Methode handle() des CallbackHandler verarbeitet nacheinander
alle Callbacks, die im Argument array der Methode angegeben sind. Daher ist der Namenswert, der in den privaten Berechtigungsnachweisen
des Clientsubjekts definiert ist, mit dem Namenswert aus dem letzten verarbeiteten Callback identisch.
Wenn CallbackHandler nicht vom Authentifizierungsmodul verwendet wird und validateRequest einen Status zurückgibt, der die erfolgreiche Ausführung anzeigt, setzt WebSphere Application Server voraus, dass eine
Hashtable-Instanz mit Benutzeridentitätsinformationen in das
clientSubject eingeschlossen wird, so dass eine angepasste Anmeldung durchgeführt werden kann, um die Berechtigungsnachweise für den Benutzer zu erhalten. Diese
Hashtable-Instanz kann dem Clientsubjekt wie im folgenden
Beispiel dargestellt hinzugefügt werden:
import java.util.Hashtable;
import java.util.String;
import javax.security.auth.Subject;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.AuthStatus;
import javax.security.auth.message.MessageInfo;
import com.ibm.wsspi.security.registry.RegistryHelper;
import com.ibm.wsspi.security.token.AttributeNameConstants.AttributeNameConstants;
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
throws AuthException {
...
UserRegistry reg = RegistryHelper.getUserRegistry(null);
String uniqueid = reg.getUniqueUserID(username);
Hashtable hashtable = new Hashtable();
hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid);
hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password);
hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groupList); //optional
clientSubject.getPrivateCredentials().add(hashtable);
...
}
Für weitere Informationen zu den Hashtable-Voraussetzungen und zur angepassten Anmeldung finden Sie unter
Angepasste JAAS-Anmeldemodule für eine Systemanmeldekonfiguration entwickeln.