Öffentliche Sicherheits-APIs
Die öffentlichen Sicherheits-APIs in Liberty ermöglichen die Erweiterung der Sicherheitsinfrastruktur.
Liberty enthält öffentliche APIs, die Sie zum Implementieren der Sicherheitsfunktionen verwenden können. Die öffentlichen Sicherheits-APIs in Liberty sind eine Untergruppe der öffentlichen Sicherheits-APIs von WebSphere Application Server Traditional. Die Hauptklassen sind WSSecurityHelper, WSSubject und RegistryHelper. Diese Klassen enthalten einen Teil der Methoden, die in den Versionen von WebSphere Application Server Traditional 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 von Liberty unterstützten öffentlichen Sicherheits-APIs sind in der Java™-API-Dokumentation beschrieben. Die Java-API-Dokumentation für jede Liberty-API ist in einer separaten ZIP-Datei (.zip) in einem der Javadoc-Unterverzeichnisse des Verzeichnisses ${wlp.install.dir}/dev verfügbar.
- WSSecurityHelper
- Diese Klasse enthält nur die Methoden isServerSecurityEnabled() und isGlobalSecurityEnabled(). Diese Aufrufe geben true zurück, wenn unter anderem appSecurity-2.0 oder zosSecurity-1.0 aktiviert ist. Andernfalls geben die Methoden den Wert false zurück. Diese Methoden werden aus Kompatibilitätsgründen aus der Klasse WSSecurityHelper von WebSphere Application Server Traditional übernommen.
- Anmerkung:
- Da keine Zellen in Liberty vorhanden sind, wird in Liberty nicht zwischen globaler Sicherheit und Serversicherheit unterschieden. Daher geben beide Methoden denselben Wert zurück.
- Die Methode revokeSSOCookies(javax.servlet.http.HttpServletRequest req,javax.servlet.http.HttpServletResponse res) wird in Liberty nicht unterstützt. Sie können stattdessen die Servlet 3.0-Abmeldefunktion 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. Alle Methoden
von WSSubject in WebSphere Application Server Traditional
werden in Liberty unterstützt. Anmerkung: Die Java-2-Sicherheit wird in Liberty 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 vertrauenswürdigen Realms. In Liberty enthält diese Klasse die folgende Untergruppe der Methoden von WebSphere Application Server Traditional:
- 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 getSSOCookieFromSSOToken() throws Exception
- PasswordUtil
- Diese Klasse stellt Codierungs- und Decodierungsmethoden für den Schutz sensibler Daten bereit. Zum Aktivieren dieser Klasse als API
konfigurieren Sie das Feature passwordUtilities-1.0 in der Datei server.xml.
Anmerkung: Diese Klasse ist auch in Full Profile enthalten. In Liberty Profile werden weitere Funktionen hinzugefügt, die weitere Methoden einführen.
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 programmgesteuerte 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 von Liberty 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() { // Nützliche Aktionen 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 programmgesteuerte 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 als aktuelles Subjekt im Thread festlegen WSSubject.setRunAsSubject(mySubject); // Nützliche Aktionen 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 ausgeben 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; } } } }