API publiques de sécurité
Les API publiques de sécurité dans le profil Liberty permettent d'étendre l'infrastructure de sécurité.
Le profil Liberty contient des API publiques que vous pouvez utiliser pour implémenter des fonctions de sécurité. Les API de sécurité publiques dans le profil Liberty constituent un sous-ensemble des API publiques de sécurité du profil complet. Les principales classes sont WSSecurityHelper, WSSubject et RegistryHelper. Ces classes contiennent chacune un sous-ensemble des méthodes disponibles dans leur classe homologue du profil complet. Il y a également une nouvelle classe, WebSecurityHelper.
Les sections suivantes décrivent ces classes principales. Il existe également d'autres classes telles que UserRegistry, WSCredential, et d'autres classes d'exception.
Toutes les API publiques de sécurité prises en charge par le profil Liberty sont décrites dans la documentation de l'API Java™. La documentation d'API Java pour chaque API de profil Liberty est détaillée dans la section Interfaces de programmation (API) du centre de documentation et est également disponible dans un fichier .zip distinct dans l'un des sous-répertoires javadoc du répertoire ${wlp.install.dir}/dev.
- WSSecurityHelper
- Cette classe contient seulement les méthodes isServerSecurityEnabled()
et isGlobalSecurityEnabled().
Toutes les deux renvoient true si l'une des
fonctions suivantes est activée
dans le fichier server.xml :
- appSecurity-2.0
- zosSecurity-1.0
- Remarque :
- Il n'existe pas de cellule dans le profil Liberty ; par conséquent, le profil Liberty ne fait pas la distinction entre la sécurité globale et la sécurité du serveur. Ainsi, les deux méthodes renvoient la même valeur.
- La méthode revokeSSOCookies(javax.servlet.http.HttpServletRequest req,javax.servlet.http.HttpServletResponse res) n'est pas prise en charge dans le profil Liberty. A la place, vous pouvez utiliser la fonction de déconnexion de servlet 3.0.
- La méthode getLTPACookieFromSSOToken() a été renommée et déplacée dans une nouvelle classe d'API publique, WebSecurityHelper.
- WSSubject
- Cette classe fournit des méthodes utilitaires pour l'interrogation et la définition
du contexte de l'unité d'exécution de sécurité. Toutes les méthodes
du profil complet
WSSubject sont prises en charge dans le profil
Liberty. Remarque : La sécurité Java 2 est prise en charge mais n'est pas activée par défaut dans le profil Liberty. Par conséquent, par défaut, les contrôles de sécurité Java 2 dans WSSubject ne sont pas effectués.
- RegistryHelper
- Cette classe fournit l'accès à l'objet UserRegistry et aux informations sur les superdomaines (realms) de confiance. Dans le profil Liberty, elle contient les sous-ensembles suivants des méthodes du profil complet ::
- 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
- Cette classe contient la méthode getLTPACookieFromSSOToken() renommée,, qui a été déplacée depuis WSSecurityHelper :
- public static Cookie getLTPACookieFromSSOToken() throws Exception
Exemples de codes utilisant les API publiques de sécurité
- Exemple 1 : Créer un sujet et l'utiliser pour l'autorisation
- Cet exemple explique comment utiliser WSSecurityHelper, WSSubject et UserRegistry pour développer des modules de connexion de programmation pour JAAS afin de créer un sujet Java, puis effectuer une action et utiliser ce sujet pour toute autorisation requise.Remarque : Le code ci-dessous utilise WSSecurityHelper pour déterminer si la sécurité est activée avant de procéder à tout traitement de sécurité supplémentaire. Cette vérification est utilisée largement en raison de la nature modulaire du profil Liberty : si la sécurité n'est pas activée, l'environnement d'exécution de la sécurité n'est pas chargé. WSSecurityHelper est toujours chargée, même si la sécurité n'est pas activée.
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) { // enregistrer des infos de diagnostic return; } String userid = "user1"; String password = "user1password"; try { if (ur.isValidUser(userid)) { // créer un sujet, authentifié avec // un ID utilisateur et un mot de passe CallbackHandler wscbh = new WSCallbackHandlerImpl(userid, password); LoginContext ctx; ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject subject = ctx.getSubject(); // Exécuter une action en utilisant le sujet pour // toute autorisation requise WSSubject.doAs(subject, action); } } catch (CustomRegistryException e) { // enregistrer des infos de diagnostic return; } catch (RemoteException e) { // enregistrer des infos de diagnostic return; } catch (LoginException e) { // enregistrer des infos de diagnostic return; } } ... private final PrivilegedAction action = new PrivilegedAction() { @Override public Object run() { // faire quelque chose d'utile ici return null; } }; }
- Exemple 2 : Créer un sujet et en faire le sujet courant sur l'unité d'exécution
- L'exemple ci-dessous explique comment utiliser WSSecurityHelper et WSSubject pour développer des modules de connexion de programmation JAAS afin de créer un sujet Java, en fait le sujet courant sur l'unité d'exécution, et restaurer le contexte d'unité d'exécution de sécurité d'origine.Remarque : Le code ci-dessous utilise WSSecurityHelper pour déterminer si la sécurité est activée avant de procéder à tout traitement de sécurité supplémentaire.
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 { // créer un sujet, authentifié avec // un ID utilisateur et un mot de passe ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject mySubject = ctx.getSubject(); Subject oldSubject = null; try { // Enregistrer une référence au sujet courant sur l'unité d'exécution oldSubject = WSSubject.getRunAsSubject(); // Faire de mySubject le sujet courant sur l'unité d'exécution WSSubject.setRunAsSubject(mySubject); // Faire quelque chose d'utile ici. Toute autorisation requise // sera contrôlée d'après les informations de mySubject } catch (WSSecurityException e) { // enregistrer des infos de diagnostic return; } finally { // Replacer le sujet original dans le contexte de l'unité d'exécution if (oldSubject != null) { try { WSSubject.setRunAsSubject(oldSubject); } catch (WSSecurityException e) { // enregistrer des infos de diagnostic } } } } catch (LoginException e) { // enregistrer des infos de diagnostic return; } }
- Exemple 3 : Obtenir des informations sur le sujet courant sur l'unité d'exécution
- L'exemple suivant explique comment utiliser WSSecurityHelper, WSSubject et WSCredential pour obtenir des informations sur le sujet courant sur l'unité d'exécution :Remarque : Le code ci-dessous utilise WSSecurityHelper pour déterminer si la sécurité est activée avant de procéder à tout traitement de sécurité supplémentaire.
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()) { // Obtenir le sujet de l'appelant Subject callerSubject; try { callerSubject = WSSubject.getCallerSubject(); } catch (WSSecurityException e) { // enregistrer des infos de diagnostic return; } WSCredential wsCred = null; Set<WSCredential> wsCredentials = callerSubject.getPublicCredentials(WSCredential.class); Iterator<WSCredential> wsCredentialsIterator = wsCredentials.iterator(); if (wsCredentialsIterator.hasNext()) { wsCred = wsCredentialsIterator.next(); try { // Imprimer la liste des groupes ArrayList<String> groups = wsCred.getGroupIds(); for (String group : groups) { System.out.println("Nom du groupe : " + group); } } catch (CredentialExpiredException e) { // enregistrer des infos de diagnostic return; } catch (CredentialDestroyedException e) { // enregistrer des infos de diagnostic return; } } } }