API públicas de seguridad en Liberty
Las API públicas de seguridad en Liberty proporcionan una forma de ampliar la infraestructura de seguridad.
Liberty contiene las API públicas que puede utilizar para implementar las funciones de seguridad. Las API de seguridad públicas de Liberty son un subconjunto de las API públicas de seguridad del WebSphere Application Server tradicional. Las clases principales son WSSecurityHelper, WSSubject y RegistryHelper. Estas clases contienen un subconjunto de los métodos que están disponibles en las versiones de WebSphere Application Server tradicional. También existe una clase WebSecurityHelper nueva.
Las siguientes secciones describen las principales clases. Existen también otras clases como UserRegistry, WSCredential, y otras clases de excepción.
Todas las API públicas de seguridad soportadas por Liberty aparecen en la documentación de la API Java™. La documentación de la API Java para cada API de Liberty está disponible en un archivo .zip separado en uno de los subdirectorios de Javadoc del directorio ${wlp.install.dir}/dev.
- WSSecurityHelper
- Esta clase contiene sólo los métodos isServerSecurityEnabled() y isGlobalSecurityEnabled(). Estas llamadas devuelven true si se ha habilitado appSecurity-2.0 o zosSecurity-1.0, entre otros. De lo contrario, los métodos devuelven false. Estos métodos se pasan de la clase WSSecurityHelper de WebSphere Application Server tradicional por compatibilidad.
- Nota:
- No hay células en Liberty, por lo que no hay ninguna diferencia en Liberty entre la seguridad global y la seguridad del servidor. Por lo tanto, ambos métodos devuelven el mismo valor.
- El método revokeSSOCookies(javax.servlet.http.HttpServletRequest req,javax.servlet.http.HttpServletResponse res) no está soportado en Liberty. En su lugar, puede utilizar la Función de fin de sesión del servlet 3.0.
- El nombre del método getLTPACookieFromSSOToken() se ha cambiado por una nueva clase de API pública: WebSecurityHelper.
- WSSubject
- Esta clase proporciona métodos de programa de utilidad para consultar y establecer el contexto de la hebra de seguridad. Todos los métodos del WebSphere Application Server tradicional
WSSubject están soportados en Liberty. Nota: Java 2 Security se admite pero no está habilitado de forma predeterminada en Liberty. Por tanto, de forma predeterminada, no se realizan las comprobaciones de seguridad Java 2 en WSSubject.
- RegistryHelper
- Esta clase proporciona acceso al objeto UserRegistry y a la información de reino de confianza. En Liberty, contiene el siguiente subconjunto de los métodos de WebSphere Application Server tradicional:
- 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)
- Nota: Este método implica que podría cambiar información dinámica cuando cambian servicios dinámicos OSGI. Los valores que se recuperan pueden pasar a estar obsoletos. Las referencias de UserRegistry nunca se deben almacenar en memoria caché.
- WebSecurityHelper
- Esta clase contiene el método getLTPACookieFromSSOToken() renombrado, que se ha movido desde WSSecurityHelper:
- public static Cookie getSSOCookieFromSSOToken() throws Exception
- PasswordUtil
- Esta clase proporciona métodos de codificación y
descodificación para proteger información confidencial. Para habilitar esta clase como API, configure la característica passwordUtilities-1.0 en el archivo server.xml.Nota: Esta clase también existe en WebSphere Application Server tradicional. Sin embargo, Liberty añade más prestaciones que presentan métodos adicionales.
Ejemplos de código de la API pública de seguridad
- Ejemplo 1: crear un sujeto y utilizarlo para autorización
- Este ejemplo muestra cómo utilizar WSSecurityHelper, WSSubject y UserRegistry para realizar un inicio de sesión mediante programación para crear un sujeto Java y, a continuación, ejecutar una acción y utilizar ese sujeto para la autorización que sea necesaria.Nota: El código siguiente utiliza WSSecurityHelper para comprobar si la seguridad está habilitada antes de continuar con el proceso de seguridad. Esta comprobación se utiliza ampliamente, debido a la naturaleza modular de Liberty: Si la seguridad no está habilitada, el tiempo de ejecución de seguridad no se carga. WSSecurityHelper siempre se carga, incluso si la seguridad no está habilitada.
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; } }; }
- Ejemplo 2: crear un sujeto y convertirlo en el sujeto actual de la hebra
- El ejemplo siguiente demuestra cómo utilizar WSSecurityHelper y WSSubject para realizar un inicio de sesión programático para crear un sujeto Java. Convierta al sujeto en el sujeto actual en la hebra y, después, restaure el contexto de hebra de seguridad original.Nota: El código siguiente utiliza WSSecurityHelper para comprobar si la seguridad está habilitada antes de continuar con el proceso de seguridad.
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; } }
- Ejemplo 3: obtener información del sujeto actual en la hebra
- El siguiente ejemplo muestra cómo utilizar WSSecurityHelper, WSSubject y WSCredential para obtener información sobre el sujeto actual en la hebra.Nota: El código siguiente utiliza WSSecurityHelper para comprobar si la seguridad está habilitada antes de continuar con el proceso de seguridad.
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; } } } }