Para un servidor de Liberty, existen varios puntos de plug-in JAAS (Java™ Authentication and Authorization Service) para configurar los inicios del sistema. Liberty utiliza configuraciones de inicio de sesión del sistema para
autenticar solicitudes de entrada. Puede desarrollar un módulo de inicio de sesión JAAS personalizado para añadir información al Subject de una configuración de inicio de sesión del sistema.
Acerca de esta tarea
Las aplicaciones de servlet llaman a las configuraciones de inicio de sesión de aplicaciones
para obtener un sujeto que se basa en información de autenticación específica. Al
escribir un módulo de inicio de sesión que se conecta a una
configuración de inicio de sesión de aplicación Liberty o
de inicio de sesión de sistema, debe desarrollar una lógica de
configuración de inicio de sesión que sepa cuando está presente
información específica y cómo utilizar la información. Consulte Configuración JAAS y Módulos de inicio de sesión de JAAS para obtener más información.
Para desarrollar un módulo de inicio de sesión JAAS personalizado para una configuración de inicio de sesión del sistema, siga los pasos del procedimiento:
Procedimiento
- Conozca las devoluciones de llamada que se pueden utilizar y cómo funcionan.
Consulte Configuración de inicio de sesión de JAAS para obtener más información sobre cómo utilizar los retornos de llamada.
Nota: Liberty sólo da soporte a los siguientes retornos de llamada:
callbacks[0] = new javax.security.auth.callback.NameCallback("Username: ");
callbacks[1] = new javax.security.auth.callback.PasswordCallback("Password: ", false);
callbacks[2] = new com.ibm.websphere.security.auth.callback.WSCredTokenCallbackImpl("Credential Token: ");
callbacks[3] = new com.ibm.websphere.security.auth.callback.WSServletRequestCallback("HttpServletRequest: ")
callbacks[4] = new com.ibm.websphere.security.auth.callback.WSServletResponseCallback("HttpServletResponse: ");
callbacks[5] = new com.ibm.websphere.security.auth.callback.WSAppContextCallback("ApplicationContextCallback: ");
callbacks[6] = new WSRealmNameCallbackImpl("Realm Name: ", default_realm);
callbacks[7] = new WSX509CertificateChainCallback("X509Certificate[]: ");
callbacks[8] = wsAuthMechOidCallback = new WSAuthMechOidCallbackImpl("AuthMechOid: ");
- Conozca las variables de estado compartido y cómo funcionan.
Si desea acceder a los objetos que crea el
WebSphere Application Server tradicional de WebSphere Application Server durante un inicio de sesión, consulte las siguientes variables de estado compartidas. Para obtener más información sobre estas variables, consulte el subtema
"Interfaces de programación del sistema" de
Interfaces de programación.- com.ibm.wsspi.security.auth.callback.Constants.WSPRINCIPAL_KEY
- Especifica un objeto implementado de la interfaz java.security.Principal. Esta variable de estado
compartido es a fines sólo de lectura.
No establezca esta variable en el estado
compartido para los módulos de inicio de sesión personalizados.
El módulo de inicio de sesión predeterminado establece esta variable.
- com.ibm.wsspi.security.auth.callback.Constants.WSCREDENTIAL_KEY
- Especifica el objeto com.ibm.websphere.security.cred.WSCredential. Esta variable de estado
compartido es a fines sólo de lectura. No establezca esta variable en el estado
compartido para los módulos de inicio de sesión personalizados.
El módulo de inicio de sesión por omisión establece esta variable.
- com.ibm.wsspi.security.auth.callback.Constants.WSSSOTOKEN_KEY
- Especifica el objeto com.ibm.wsspi.security.token.SingleSignonToken. No establezca esta variable en el estado
compartido para los módulos de inicio de sesión personalizados. El módulo de inicio de sesión predeterminado establece esta variable.
- Opcional: Conozca las tablas hash para los módulos de inicio de sesión JAAS en Liberty. Consulte
Módulo de inicio de sesión de tabla hash
para obtener más detalles.
- Desarrolle un módulo de inicio de sesión personalizado utilizando devoluciones de llamada y estado compartido.
Puede utilizar el siguiente ejemplo para obtener información sobre cómo utilizar algunas
de las devoluciones de llamada y las variables de estado compartido.
public class CustomCallbackLoginModule implements LoginModule {
protected Map<String, ?> _sharedState;
protected Subject _subject = null;
protected CallbackHandler _callbackHandler;
private final String customPrivateCredential = "CustomLoginModuleCredential";
/**
* Inicialización del módulo de inicio de sesión
*/
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
_sharedState = sharedState;
_subject = subject;
_callbackHandler = callbackHandler;
}
public boolean login() throws LoginException {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() throws Exception {
_subject.getPrivateCredentials().add(customPrivateCredential);
return null;
}
});
} catch (PrivilegedActionException e) {
throw new LoginException(e.getLocalizedMessage());
}
String username = null;
char passwordChar[] = null;
byte[] credToken = null;
HttpServletRequest request = null;
HttpServletResponse response = null;
Map appContext = null;
String realm = null;
String authMechOid = null;
java.security.cert.X509Certificate[] certChain = null;
NameCallback nameCallback = null;
PasswordCallback passwordCallback = null;
WSCredTokenCallbackImpl wsCredTokenCallback = null;
WSServletRequestCallback wsServletRequestCallback = null;
WSServletResponseCallback wsServletResponseCallback = null;
WSAppContextCallback wsAppContextCallback = null;
WSRealmNameCallbackImpl wsRealmNameCallback = null;
WSX509CertificateChainCallback wsX509CertificateCallback = null;
WSAuthMechOidCallbackImpl wsAuthMechOidCallback = null;
Callback[] callbacks = new Callback[9];
callbacks[0] = nameCallback = new NameCallback("Username: ");
callbacks[1] = passwordCallback = new PasswordCallback("Password: ", false);
callbacks[2] = wsCredTokenCallback = new WSCredTokenCallbackImpl("Credential Token: ");
callbacks[3] = wsServletRequestCallback = new WSServletRequestCallback("HttpServletRequest: ");
callbacks[4] = wsServletResponseCallback = new WSServletResponseCallback("HttpServletResponse: ");
callbacks[5] = wsAppContextCallback = new WSAppContextCallback("ApplicationContextCallback: ");
callbacks[6] = wsRealmNameCallback = new WSRealmNameCallbackImpl("Realm name:");
callbacks[7] = wsX509CertificateCallback = new WSX509CertificateChainCallback("X509Certificate[]: ");
callbacks[8] = wsAuthMechOidCallback = new WSAuthMechOidCallbackImpl("AuthMechOid: ");
try {
_callbackHandler.handle(callbacks);
} catch (Exception e) {
// manejar excepción
}
if (nameCallback != null)
username = nameCallback.getName();
if (passwordCallback != null)
passwordChar = passwordCallback.getPassword();
if (wsCredTokenCallback != null)
credToken = wsCredTokenCallback.getCredToken();
if (wsServletRequestCallback != null)
request = wsServletRequestCallback.getHttpServletRequest();
if (wsServletResponseCallback != null)
response = wsServletResponseCallback.getHttpServletResponse();
if (wsAppContextCallback != null)
appContext = wsAppContextCallback.getContext();
if (wsRealmNameCallback != null)
realm = wsRealmNameCallback.getRealmName();
if (wsX509CertificateCallback != null)
certChain = wsX509CertificateCallback.getX509CertificateChain();
if (wsAuthMechOidCallback != null)
authMechOid = wsAuthMechOidCallback.getAuthMechOid();
_subject.getPrivateCredentials().add("username = " + username);
_subject.getPrivateCredentials().add("password = " + String.valueOf(passwordChar));
_subject.getPrivateCredentials().add("realm = " + realm);
_subject.getPrivateCredentials().add("authMechOid = " + authMechOid.toString());
return true;
}
public boolean commit() throws LoginException {
return true;
}
public boolean abort() {
return true;
}
public boolean logout() {
return true;
}
}
- Opcional: Desarrolle un módulo de inicio de sesión personalizado de muestra utilizando el inicio de sesión de tabla hash.
Puede utilizar el siguiente ejemplo para obtener información sobre cómo utilizar
el inicio de sesión de tabla hash.
package com.ibm.websphere.security.sample;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import com.ibm.wsspi.security.token.AttributeNameConstants;
/**
* Módulo de inicio de sesión personalizado que añade otras PublicCredential al Subject
*/
@SuppressWarnings("unchecked")
public class CustomHashtableLoginModule implements LoginModule {
protected Map<String, ?> _sharedState;
protected Map<String, ?> _options;
/**
* Inicialización del módulo de inicio de sesión
*/
public void initialize(
Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
_sharedState = sharedState;
_options = options;
}
public boolean login() throws LoginException {
try {
java.util.Hashtable<String, Object> customProperties = (java.util.Hashtable<String, Object>)
_sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new java.util.Hashtable<String, Object>();
}
customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, "userId");
// Ejemplo de creación de clave de memoria caché personalizada
customProperties.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, "customCacheKey");
/*
* Ejemplo para crear un ID de usuario y un nombre de seguridad
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, "userId");
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, "securityName");
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_REALM, "realm");
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, "groupList");
*/
/*
* Ejemplo para crear un ID de usuario y contraseña
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, "userId");
* customProperties.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, "password");
*/
Map<String, java.util.Hashtable> mySharedState = (Map<String, java.util.Hashtable>) _sharedState;
mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY, customProperties);
} catch (Exception e) {
throw new LoginException("LoginException: " + e.getMessage());
}
return true;
}
public boolean commit() throws LoginException {
return true;
}
public boolean abort() {
return true;
}
public boolean logout() {
return true;
}
}
Qué hacer a continuación
Añada el módulo de inicio de sesión personalizado en las configuraciones de
inicio de sesión en el sistema WEB_INBOUND y JAAS (Java Authentication and Authorization Service) DEFAULT
del archivo server.xml. Coloque la clase de módulo de inicio de sesión personalizado en un archivo JAR, por ejemplo, customLoginModule.jar
y, a continuación, haga disponible el archivo JAR para el servidor de Liberty. Consulte Configuración de un módulo de inicio de sesión personalizado JAAS para Liberty.