Liberty : API publiques de sécurité
Les API publiques de sécurité dans Liberty permettent d'étendre l'infrastructure de sécurité.
Liberty contient des API publiques que vous pouvez utiliser pour implémenter des fonctions de sécurité. Les API de sécurité publiques dans Liberty constituent un sous-ensemble des API publiques de sécurité du WebSphere Application Server Traditional. Les principales classes sont WSSecurityHelper, WSSubject et RegistryHelper. Ces classes contiennent chacune un sous-ensemble des méthodes disponibles dans les versions traditionnelles de WebSphere Application Server. 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 Liberty sont décrites dans la documentation de l'API Java™. La documentation d'API Java pour chaque API Liberty API est disponible dans un fichier .zip distinct des sous-répertoires javadoc du répertoire ${wlp.install.dir}/dev.
- WSSecurityHelper
- Cette classe contient seulement les méthodes isServerSecurityEnabled() et isGlobalSecurityEnabled(). Ces appels renvoient true si appSecurity-2.0 ou zosSecurity-1.0, entre autres, sont activés. Sinon, les méthodes renvoient false. Ces méthodes sont reprises de la classe WSSecurityHelper du WebSphere Application Server Traditional pour des raisons de compatibilité.
- Remarque :
- Il n'existe pas de cellule dans Liberty ; par conséquent, 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 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 WebSphere Application Server Traditional
WSSubject sont prises en charge dans
Liberty. Remarque : La sécurité Java 2 est prise en charge mais n'est pas activée par défaut dans 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 domaines de confiance. Dans Liberty, elle contient les sous-ensembles suivants des méthodes du 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
- Cette classe contient la méthode getLTPACookieFromSSOToken() renommée, qui a été déplacée depuis WSSecurityHelper :
- public static Cookie getSSOCookieFromSSOToken() throws Exception
- PasswordUtil
- Cette classe fournit des méthodes de codage et de décodage pour protéger les informations sensibles. Pour l'activer en tant
qu'API, configurez la fonction passwordUtilities-1.0 dans le fichier server.xml.Remarque : Cette classe existe également dans WebSphere Application Server Traditional. Toutefois, Liberty ajoute d'autres capacités qui introduisent des méthodes supplémentaires.
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 de 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) { // record some diagnostic info return; } String userid = "user1"; String password = "user1password"; try { if (ur.isValidUser(userid)) { // create a Subject, authenticating with // a userid and password CallbackHandler wscbh = new WSCallbackHandlerImpl(userid, password); LoginContext ctx; ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject subject = ctx.getSubject(); // Perform an action using the Subject for // any required authorization WSSubject.doAs(subject, action); } } catch (CustomRegistryException e) { // record some diagnostic info return; } catch (RemoteException e) { // record some diagnostic info return; } catch (LoginException e) { // record some diagnostic info return; } } ... private final PrivilegedAction action = new PrivilegedAction() { @Override public Object run() { // do something useful here 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 { // create a Subject, authenticating with // a userid and password ctx = new LoginContext("WSLogin", wscbh); ctx.login(); Subject mySubject = ctx.getSubject(); Subject oldSubject = null; try { // Save a ref to the current Subject on the thread oldSubject = WSSubject.getRunAsSubject(); // Make mySubject the current Subject on the thread WSSubject.setRunAsSubject(mySubject); // Do something useful here. Any authorization // required will be performed using mySubject } catch (WSSecurityException e) { // record some diagnostic info return; } finally { // Put the original Subject back on the thread context if (oldSubject != null) { try { WSSubject.setRunAsSubject(oldSubject); } catch (WSSecurityException e) { // record some diagnostic info } } } } catch (LoginException e) { // record some diagnostic info 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()) { // Get the caller's subject Subject callerSubject; try { callerSubject = WSSubject.getCallerSubject(); } catch (WSSecurityException e) { // record some diagnostic info return; } WSCredential wsCred = null; Set<WSCredential> wsCredentials = callerSubject.getPublicCredentials(WSCredential.class); Iterator<WSCredential> wsCredentialsIterator = wsCredentials.iterator(); if (wsCredentialsIterator.hasNext()) { wsCred = wsCredentialsIterator.next(); try { // Print out the groups ArrayList<String> groups = wsCred.getGroupIds(); for (String group : groups) { System.out.println("Group name: " + group); } } catch (CredentialExpiredException e) { // record some diagnostic info return; } catch (CredentialDestroyedException e) { // record some diagnostic info return; } } } }