Öffentliche Sicherheits-APIs
Die öffentlichen Sicherheits-APIs im Liberty-Profil ermöglichen die Erweiterung der Sicherheitsinfrastruktur.
Liberty Profile enthält öffentliche APIs, die Sie zum Implementieren der Sicherheitsfunktionen verwenden können. Die öffentlichen Sicherheits-APIs in Liberty Profile sind eine Untergruppe der öffentlichen Sicherheits-APIs von vollständiges Profil. Die Hauptklassen sind WSSecurityHelper, WSSubject und RegistryHelper. Diese Klassen enthalten eine Untergruppe der Methoden, die in den Full Profile-Versionen verfügbar sind. Außerdem gibt es eine neue Klasse mit dem Namen WebSecurityHelper.
Diese Hauptklassen sind in den folgenden Abschnitten beschrieben. Darüber hinaus gibt es noch weitere Klassen wie UserRegistry und WSCredential sowie weitere Ausnahmeklassen.
Alle vom Liberty-Profil unterstützten öffentlichen Sicherheits-APIs sind in der Java™-API-Dokumentation beschrieben. Ausführliche Informationen zur Java-API-Dokumentation für die einzelnen APIs von Liberty Profile finden Sie im Information Center im Abschnitt Programmierschnittstellen (APIs). Die Java-API-Dokumentation ist außerdem als eigenständige .zip-Datei in einem der Javadoc-Unterverzeichnisse des Verzeichnisses ${wlp.install.dir}/dev verfügbar.
- WSSecurityHelper
- Diese Klasse enthält nur die Methoden isServerSecurityEnabled() und isGlobalSecurityEnabled().
Beide Methoden geben den Wert true zurück, wenn eines der folgenden Features in der Datei
server.xml aktiviert ist:
- appSecurity-2.0
- zosSecurity-1.0
- Anmerkung:
- Da keine Zellen im Liberty-Profil vorhanden sind, wird im Liberty-Profil nicht zwischen globaler Sicherheit und Serversicherheit unterschieden. Beide Methoden geben den gleichen Wert zurück.
- Die Methode revokeSSOCookies(javax.servlet.http.HttpServletRequest req,javax.servlet.http.HttpServletResponse res) wird im Liberty-Profil nicht unterstützt. Stattdessen können Sie die Abmeldefunktion von Servlet Version 3.0 verwenden.
- Die Methode getLTPACookieFromSSOToken() wurde in die neue öffentliche API-Klasse WebSecurityHelper umbenannt.
- WSSubject
- Diese Klasse enthält Dienstprogrammmethoden für die Abfrage und das Festlegen des Sicherheitsthreadkontexts. Im Liberty-Profil werden
alle Methoden des vollständigen Profils von vollständiges Profil WSSubject unterstützt.
Anmerkung: Die Java-2-Sicherheit wird im Liberty-Profil unterstützt, ist aber nicht standardmäßig aktiviert. Daher werden die Java-2-Sicherheitsprüfungen in WSSubject standardmäßig nicht ausgeführt.
- RegistryHelper
- Diese Klasse ermöglicht den Zugriff auf das UserRegistry-Objekt und auf Informationen zu anerkannten Realms. Im Liberty-Profil enthält diese Klasse das folgende Subset der Methoden des vollständigen Profils:
- public static UserRegistry getUserRegistry(String realmName) throws WSSecurityException
- public static List<String> getInboundTrustedRealms(String realmName) throws WSSecurityException
- public static boolean isRealmInboundTrusted(String inboundRealm, String localRealm)
- WebSecurityHelper
- Diese Klasse enthält die umbenannte Methode getLTPACookieFromSSOToken(), die aus WSSecurityHelper verschoben wurde:
- public static Cookie getLTPACookieFromSSOToken() throws Exception
Codebeispiele für die öffentliche Sicherheits-API
- Beispiel 1: Subject-Objekt erstellen und für Berechtigung verwenden
- Dieses Beispiel veranschaulicht, wie WSSecurityHelper, WSSubject
und UserRegistry für eine programmgestützte Anmeldung verwendet werden,
um ein Java-Subject-Objekt zu erstellen und dann eine
Aktion mit diesem Subject-Objekt für jede erforderliche Berechtigung durchzuführen.Anmerkung: Der folgende Code verwendet WSSecurityHelper, um zu prüfen, ob die Sicherheit aktiviert ist, bevor eine weitere Sicherheitsverarbeitung durchgeführt wird. Diese Prüfung wird wegen der modularen Struktur des Liberty-Profils häufig verwendet. Wenn die Sicherheit nicht aktiviert ist, wird die Sicherheitslaufzeit nicht geladen. WSSecurityHelper wird immer geladen, auch wenn die Sicherheit nicht aktiviert ist.
import java.rmi.RemoteException; import java.security.PrivilegedAction; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import com.ibm.websphere.security.CustomRegistryException; import com.ibm.websphere.security.UserRegistry; import com.ibm.websphere.security.WSSecurityException; import com.ibm.websphere.security.WSSecurityHelper; import com.ibm.websphere.security.auth.WSSubject; import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl; import com.ibm.wsspi.security.registry.RegistryHelper; public class myServlet { ... if (WSSecurityHelper.isServerSecurityEnabled()) { UserRegistry ur = null; try { ur = RegistryHelper.getUserRegistry(null); } catch (WSSecurityException e1) { // Diagnosinformationen aufzeichnen return; } String userid = "user1"; String password = "user1password"; try { if (ur.isValidUser(userid)) { // Subjekt erstellen, mit Benutzer-ID // und Kennwort authentifizieren CallbackHandler wscbh = new WSCallbackHandlerImpl(userid, password); LoginContext ctx; ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject subject = ctx.getSubject(); // Aktion mit dem Subjekt ausführen, // das für erforderliche Berechtigungen verwendet wird WSSubject.doAs(subject, action); } } catch (CustomRegistryException e) { // Diagnosinformationen aufzeichnen return; } catch (RemoteException e) { // Diagnosinformationen aufzeichnen return; } catch (LoginException e) { // Diagnosinformationen aufzeichnen return; } } ... private final PrivilegedAction action = new PrivilegedAction() { @Override public Object run() { // Etwas ausführen return null; } }; }
- Beispiel 2: Subject-Objekt erstellen und als aktuelles Subject-Objekt im Thread festlegen
- Das folgende Beispiel veranschaulicht, wie WSSecurityHelper und WSSubject
für eine programmgestützte Anmeldung verwendet werden, um ein Java-Subjekt
zu erstellen, das Subjekt als aktuelles Subjekt im Thread festzulegen und dann den Kontext des ursprünglichen
Sicherheitsthreads wiederherzustellen.Anmerkung: Der folgende Code verwendet WSSecurityHelper, um zu prüfen, ob die Sicherheit aktiviert ist, bevor eine weitere Sicherheitsverarbeitung durchgeführt wird.
import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import com.ibm.websphere.security.WSSecurityException; import com.ibm.websphere.security.WSSecurityHelper; import com.ibm.websphere.security.auth.WSSubject; import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl; ... if (WSSecurityHelper.isServerSecurityEnabled()) { CallbackHandler wscbh = new WSCallbackHandlerImpl("user1", "user1password"); LoginContext ctx; try { // Subjekt erstellen, mit Benutzer-ID // und Kennwort authentifizieren ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject mySubject = ctx.getSubject(); Subject oldSubject = null; try { // Referenz auf das aktuelle Subjekt im Thread speichern oldSubject = WSSubject.getRunAsSubject(); // mySubject zum aktuellen Subjekt im Thread festlegen WSSubject.setRunAsSubject(mySubject); // Ewas ausführen. Alle erforderlichen Berechtigungen // werden mit "mySubject" durchgeführt } catch (WSSecurityException e) { // Diagnosinformationen aufzeichnen return; } finally { // ursprüngliches Subjekt wieder in den Threadkontext zurückgeben if (oldSubject != null) { try { WSSubject.setRunAsSubject(oldSubject); } catch (WSSecurityException e) { // Diagnosinformationen aufzeichnen } } } } catch (LoginException e) { // Diagnosinformationen aufzeichnen return; } }
- Beispiel 3: Informationen zum aktuellen Subject-Objekt im Thread abrufen
- Das folgende Beispiel veranschaulicht, wie WSSecurityHelper, WSSubject
und WSCredential verwendet werden, um Informationen zum
aktuellen Subjekt im Thread abzurufen.
Anmerkung: Der folgende Code verwendet WSSecurityHelper, um zu prüfen, ob die Sicherheit aktiviert ist, bevor eine weitere Sicherheitsverarbeitung durchgeführt wird.
import java.util.ArrayList; import java.util.Iterator; import java.util.Set; import javax.security.auth.Subject; import javax.security.auth.login.CredentialExpiredException; import com.ibm.websphere.security.WSSecurityException; import com.ibm.websphere.security.WSSecurityHelper; import com.ibm.websphere.security.auth.CredentialDestroyedException; import com.ibm.websphere.security.auth.WSSubject; import com.ibm.websphere.security.cred.WSCredential; ... if (WSSecurityHelper.isServerSecurityEnabled()) { // Caller-Subjekt abrufen Subject callerSubject; try { callerSubject = WSSubject.getCallerSubject(); } catch (WSSecurityException e) { // Diagnosinformationen aufzeichnen return; } WSCredential wsCred = null; Set<WSCredential> wsCredentials = callerSubject.getPublicCredentials(WSCredential.class); Iterator<WSCredential> wsCredentialsIterator = wsCredentials.iterator(); if (wsCredentialsIterator.hasNext()) { wsCred = wsCredentialsIterator.next(); try { // Gruppen drucken ArrayList<String> groups = wsCred.getGroupIds(); for (String group : groups) { System.out.println("Group name: " + group); } } catch (CredentialExpiredException e) { // Diagnosinformationen aufzeichnen return; } catch (CredentialDestroyedException e) { // Diagnosinformationen aufzeichnen return; } } } }