API públicas de seguridad
Las API públicas de seguridad proporcionan un modo de ampliar la infraestructura de seguridad.
El perfil Liberty contiene las API públicas que puede utilizar para implementar las funciones de seguridad. Las API de seguridad públicas del perfil Liberty son un subconjunto de las API púbicas de seguridad del perfil completo. Las clases principales son WSSecurityHelper, WSSubject y RegistryHelper. Estas clases contienen un subconjunto de los métodos que están disponibles en las versiones completas del perfil. 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 el perfil Liberty aparecen en la documentación de la API Java™. La documentación de la API Java para cada API de perfil Liberty se detalla en la sección Interfaces de programación (API) del Information Center, y también está disponible como un archivo .zip aparte en uno de los subdirectorios javadoc del directorio ${wlp.install.dir}/dev.
- WSSecurityHelper
- Esta clase contiene sólo los métodos isServerSecurityEnabled() y isGlobalSecurityEnabled(). Los dos devuelven true si está
habilitada cualquiera de estas características en el archivo server.xml:
- appSecurity-2.0
- zosSecurity-1.0
- Nota:
- No hay células en el perfil Liberty, por lo que no hay ninguna diferencia en el perfil 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 el perfil 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 perfil completo WSSubject se admiten en el perfil Liberty. Nota: Java 2 Security se admite pero no está habilitado de forma predeterminada en el perfil 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 el perfil Liberty, contiene el siguiente subconjunto de los métodos de perfil completo:
- 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
- Esta clase contiene el método getLTPACookieFromSSOToken() con nuevo nombre, que se ha movido desde WSSecurityHelper:
- public static Cookie getLTPACookieFromSSOToken() throws Exception
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 del perfil 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 siguiente ejemplo muestra cómo utilizar WSSecurityHelper y WSSubject para realizar un inicio de sesión programado para crear un sujeto Java, convertirlo en el sujeto actual de la hebra y, finalmente, restaurar el contexto de la 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; } } } }