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

Los siguientes ejemplos muestran cómo utilizar las API públicas de seguridad en Liberty para realizar un inicio de sesión programado y operar en el sujeto.
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;
		}
	}
}
}

Icono que indica el tipo de tema Tema de referencia

Nombre de archivo: rwlp_sec_apis.html