Inicio de sesión mediante programa para JAAS
El inicio de sesión programado es un tipo de inicio de sesión con formulario que da soporte a los formularios de inicio de sesión específicos del sitio de presentación de aplicaciones para fines de autenticación.
En caso de que las aplicaciones de cliente de enterprise bean exijan que el usuario proporcione información de identificación, el autor de la aplicación debe reunir esa información y autenticar al usuario. El trabajo del programador puede clasificarse de forma general en función del lugar en el que se realiza la autenticación del usuario:
- En un programa cliente
- En un programa servidor
Se puede solicitar a los usuarios de aplicaciones web que proporcionen datos de autenticación de muchas maneras. El <configuración de inicio de sesión> El elemento en el archivo descriptor de implementación de la aplicación web define el mecanismo que se utiliza para recopilar esta información. Los programadores que prefieran personalizar los procedimientos de inicio de sesión y no depender de dispositivos generales como una ventana de diálogo 401 en un navegador, pueden utilizar el inicio de sesión basado en formularios para proporcionar un formulario HTML específico de la aplicación para reunir información de inicio de sesión.
No se produce ninguna autenticación a menos que seguridad administrativa está habilitado. Si desea utilizar el inicio de sesión basado en formularios para aplicaciones web, debe especificar FORMA en la etiqueta auth-method del <configuración de inicio de sesión> elemento en el descriptor de implementación de cada aplicación web.
Las aplicaciones pueden presentar formularios de inicio de sesión específicos del sitio utilizando el WebSphere® Application Server tipo de inicio de sesión de formulario. El Java™ Platform, Enterprise Edition ( Java EE ) la especificación define el inicio de sesión mediante formulario como uno de los métodos de autenticación para aplicaciones web. WebSphere Application Server proporciona un mecanismo de cierre de sesión.
Inicio de sesión programático del Servicio de autenticación y autorización de Java
Servicio de autenticación y autorización de Java ( JAAS) es una característica en WebSphere Application Server. También está ordenado por el Java EE 1.4 Especificación. JAAS es una colección de interfaces de programas de aplicación (API) de autenticación estratégica que sustituyen a las API de inicio de sesión mediante programa de CORBA (Common Object Request Broker Architecture). WebSphere Application Server proporciona algunas extensiones a JAAS:
- Para la aplicación cliente Java pura o la aplicación contenedora del cliente, inicialice la seguridad del Agente de solicitud de objetos (ORB) del cliente antes de realizar una JAAS acceso. Para ello, ejecute el siguiente código antes del inicio de
sesión JAAS:
... import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; ... // Perform an InitialContext and default lookup prior to logging // in to initialize ORB security and for the bootstrap host/port // to be determined for SecurityServer lookup. If you do not want // to validate the userid/password during the JAAS login, disable // the com.ibm.CORBA.validateBasicAuth property in the // sas.client.props file. Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809"); Context initialContext = new InitialContext(env); Object obj = initialContext.lookup("");Nota: Colocarcom.ibm.CORBA.validateBasicAuth=false cada vez que se conecta a un z/OS® servidor. Esta función actualmente no funciona desde un cliente distribuido a un z/OS servidor desde el SecurityServer se localiza utilizando el principal "NO AUTENTIFICADO", que no se acepta en un z/OS sistema.
- Para la aplicación cliente Java pura o la aplicación contenedora cliente, asegúrese de que el nombre de host y el número de puerto de las propiedades de arranque de la interfaz de directorio y nombres Java (JNDI) de destino estén especificados correctamente. Ver el Desarrollar aplicaciones que utilicen CosNaming (Interfaz de nombres CORBA) sección para más detalles.
- Si la aplicación utiliza personalizado JAAS configuración de inicio de sesión, asegúrese de que costumbre JAAS la configuración de inicio de sesión está correctamente definida.
- Algunos de los JAAS Las API están protegidas por permisos de seguridad de Java 2. Si el código de aplicación utiliza estas API, asegúrese de que se han añadido estos permisos al archivo was.policy de la aplicación. Ver Añadiendo el was.policy archivo a aplicaciones para seguridad Java 2, Usando PolicyTool para editar archivos de políticas para la seguridad de Java 2 y Configurando el was.policy archivo para seguridad de Java 2 secciones para más detalles. Para obtener más detalles sobre qué API están protegidas por los permisos de seguridad de Java 2, consulte la IBM® Kit de desarrollador, edición de tecnología Java; JAAS y el WebSphere Application Server Documentación de API públicas para obtener más detalles. En la siguiente lista se incluyen las API que se utilizan en los ejemplos de código que se proporcionan en esta documentación.
- Los constructores javax.security.auth.login.LoginContext están protegidos por javax.security.auth.AuthPermission "createLoginContext".
- javax.security.auth.Subject.doAs y com.ibm.websphere.security.auth.WSSubject.doAs están protegidos por javax.security.auth.AuthPermission "doAs".
- javax.security.auth.Subject.doAsPrivileged y com.ibm.websphere.security.auth.WSSubject.doAsPrivileged están protegidos por javax.security.auth.AuthPermission "doAsPrivileged".
- com.ibm.websphere.security.auth.WSSubject: debido a un error de diseño en JAAS Versión 1.0, javax.security.auth.Subject.getSubject no devuelve el Sujeto asociado con la hebra en ejecución dentro de un bloque de código java.security.AccessController.doPrivileged. Esto puede dar lugar a errores de coherencia, por lo que se necesitará un trabajo adicional para solucionarlos. La API com.ibm.websphere.security.auth.WSSubject proporciona una solución alternativa que permite asociar el sujeto con la hebra en ejecución. El com.ibm.websphere.security.auth.WSSubject API amplía la JAAS modelo para Java EE recursos para los controles de autorización. El Asunto que está asociado con el hilo en ejecución dentro com.ibm.websphere.security.auth.WSSubject.doAs o com.ibm.websphere.security.auth.WSSubject.doAsPrivileged El bloque de código se utiliza para Java EE controles de autorización de recursos.
- Soporte de consola administrativa para definir nuevos JAAS configuración de inicio de sesión: Puede configurar JAAS configuración de inicio de sesión en la consola administrativa y guárdela en el WebSphere Application Server API de configuración. Las aplicaciones pueden definir nuevos JAAS configuración de inicio de sesión en la consola administrativa y los datos se conservan en el repositorio de configuración que se almacena con el WebSphere Application Server API de configuración. Sin embargo, WebSphere Application Server todavía admite el valor predeterminado JAAS formato de configuración de inicio de sesión proporcionado por el JAAS implementación predeterminada. Si las configuraciones de inicio de sesión duplicadas están definidas tanto en el WebSphere Application Server API de configuración y el formato de archivo de texto sin formato, la configuración de inicio de sesión en el WebSphere Application Server La API de configuración tiene prioridad. Ventajas de definir la configuración de inicio de sesión en el WebSphere Application Server La API de configuración incluye:
- La definición de la configuración de inicio de sesión JAAS con la consola administrativa.
- La gestión central de la configuración de inicio de sesión JAAS.
- Distribuyendo el JAAS configuración de inicio de sesión en un WebSphere Application Server Network Deployment instalación.
- JAAS configuraciones de inicio de sesión para WebSphere Application Server: WebSphere Application Server proporciona JAAS configuraciones de inicio de sesión para que las aplicaciones realicen autenticación programática en el WebSphere Application Server tiempo de ejecución de seguridad. Estos JAAS configuraciones de inicio de sesión para WebSphere Application Server realizar la autenticación al mecanismo de autenticación configurado, Simple WebSphere Mecanismo de autenticación (SWAM) o autenticación ligera de terceros (LTPA) y registro de usuarios (sistema operativo local, LDAP o personalizado) en función de los datos de autenticación proporcionados. El Sujeto autenticado de estos JAAS Las configuraciones de inicio de sesión contienen el principal y las credenciales requeridas que pueden ser utilizadas por el WebSphere Application Server tiempo de ejecución de seguridad para realizar comprobaciones de autorización en Java EE recursos protegidos basados en roles.Nota: SWAM está en desuso en WebSphere Application Server Versión 8.5 y se eliminará en una versión futura.Aquí están los JAAS configuraciones de inicio de sesión proporcionadas por WebSphere Application Server:
- WSIniciar sesión JAAS configuración de inicio de sesión: una genérica JAAS configuración de inicio de sesión que un cliente Java, una aplicación contenedora de cliente, un servlet, un archivo JSP, un Enterprise Bean, etc., pueden utilizar para realizar una autenticación basada en un ID de usuario y una contraseña, o en un token para el WebSphere Application Server tiempo de ejecución de seguridad. No obstante, esta configuración no da soporte al manejador CallbackHandler especificado en el descriptor de despliegue del contenedor del cliente.
- Configuración de inicio de sesión JAAS ClientContainer: esta configuración de inicio de sesión JAAS reconoce el manejador CallbackHandler especificado en el descriptor de despliegue del contenedor del cliente. El módulo de inicio de sesión de esta configuración de inicio de sesión utiliza el manejador CallbackHandler en el descriptor de despliegue del contenedor del cliente, si se ha especificado uno, aunque el código de aplicación haya especificado un manejador CallbackHandler en el contexto de inicio de sesión. Esto se aplica a la aplicación del contenedor del cliente.
- Los sujetos autenticados con las configuraciones de inicio de sesión JAAS anteriores contienen un principal com.ibm.websphere.security.auth.WSPrincipal y una credencial com.ibm.websphere.security.auth.WSCredential. Si el Asunto autenticado se pasa al com.ibm.websphere.security.auth.WSSubject.doAs método u otro doAs métodos, el WebSphere Application Server El tiempo de ejecución de seguridad puede realizar comprobaciones de autorización en Java EE recursos, según el tema com.ibm.websphere.security.auth.WSCredential credencial.
- Definido por el cliente JAAS configuraciones de inicio de sesión: puede definir otro JAAS configuraciones de inicio de sesión. Utilice estas configuraciones de inicio de sesión para realizar la autenticación mediante programa en el mecanismo de autenticación personalizado. Sin embargo, los temas de estos definidos por el cliente JAAS Es posible que las configuraciones de inicio de sesión no sean utilizadas por el WebSphere Application Server tiempo de ejecución de seguridad para realizar comprobaciones de autorización si el asunto no contiene el principal y las credenciales requeridas.
Búsqueda de la excepción de inicio de sesión de la causa raíz en un inicio de sesión JAAS
Si obtiene una excepción LoginException después de emitir la API LoginContext.login, puede buscar la excepción de la causa raíz en el registro de usuarios configurado. En los módulos de inicio de sesión, las excepciones de registro están envueltas por una clase com.ibm.websphere.security.auth.WSLoginFailedException. Esta excepción tiene un método getCause con el que puede extraer la excepción que estaba envuelta después de emitir el mandato anterior.
No siempre tiene la garantía de obtener una excepción WSLoginFailedException, pero la mayoría de excepciones generadas a partir del registro de usuarios aparecen aquí. En el siguiente ejemplo se muestra una API LoginContext.login con el bloque de captura asociado. Convierta la excepción WSLoginFailedException en la clase com.ibm.websphere.security.auth.WSLoginFailedException si desea emitir la API getCause.
try
{
lc.login();
}
catch (LoginException le)
{
// drill down through the exceptions as they might cascade through the runtime
Throwable root_exception = determineCause(le);
// now you can use "root_exception" to compare to a particular exception type
// for example, if you have implemented a CustomUserRegistry type, you would
// know what to look for here.
}
/* Method used to drill down into the WSLoginFailedException to find the
"root cause" exception */
public Throwable determineCause(Throwable e)
{
Throwable root_exception = e, temp_exception = null;
// keep looping until there are no more embedded WSLoginFailedException or
// WSSecurityException exceptions
while (true)
{
if (e instanceof com.ibm.websphere.security.auth.WSLoginFailedException)
{
temp_exception = ((com.ibm.websphere.security.auth.WSLoginFailedException)
e).getCause();
}
else if (e instanceof com.ibm.websphere.security.WSSecurityException)
{
temp_exception = ((com.ibm.websphere.security.WSSecurityException)
e).getCause();
}
else if (e instanceof javax.naming.NamingException)
// check for Ldap embedded exception
{
temp_exception = ((javax.naming.NamingException)e).getRootCause();
}
else if (e instanceof your_custom_exception_here)
{
// your custom processing here, if necessary
}
else
{
// this exception is not one of the types we are looking for,
// lets return now, this is the root from the WebSphere
// Application Server perspective
return root_exception;
}
if (temp_exception != null)
{
// we have an exception; go back and see if this has another
// one embedded within it.
root_exception = temp_exception;
e = temp_exception;
continue;
}
else
{
// we finally have the root exception from this call path, this
// has to occur at some point
return root_exception;
}
}
}
Búsqueda de la excepción de inicio de sesión de la causa raíz en un filtro de servlet
Throwable t = com.ibm.websphere.security.auth.WSSubject.getRootLoginException();
if (t != null)
t = determineCause(t);
Cuando tenga la excepción, puede ejecutarla en el ejemplo determineCause anterior para obtener la causa raíz del registro original.
Habilitación de la propagación de excepciones de inicio de sesión de causa raíz a clientes Java puros
Actualmente, la causa raíz no se propaga a un cliente puro por motivos de seguridad. No obstante, puede que desee propagar la causa raíz a un cliente puro en un entorno de confianza. Si desea habilitar la propagación de excepción de inicio de sesión de causa raíz a un cliente puro, haga clic en sobre elWebSphere Application Server Consola administrativa y establezca la siguiente propiedad:
com.ibm.websphere.security.registry.propagateExceptionsToClient=trueInicio de sesión mediante programa sin solicitud
javax.security.auth.login.LoginContext lc = null;
try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl("user",
"securityrealm", "securedpassword"));
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determine how authentication data is collected
// in this case, the authentication data is "push" to the authentication mechanism
// implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: "
+ e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resource using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00); // where bankAccount is a protected EJB
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}Puedes usar el com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl controlador de devolución de llamada con un cliente Java puro, un contenedor de aplicaciones cliente, un Enterprise Bean, JavaServer archivos de Pages (JSP), servlet u otra plataforma Java 2, Enterprise Edition ( Java EE ) recursos.
Inicio de sesión mediante programa con solicitud de interfaz de usuario
javax.security.auth.login.LoginContext lc = null;
try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSGUICallbackHandlerImpl());
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determine how authentication data is collected
// in this case, the authentication date is collected by GUI login prompt
// and pass to the authentication mechanism implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: "
+ e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resources using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00); // where bankAccount is a protected enterprise bean
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}WebSphere Application Server también proporciona un Kerberos implementación de caché de credenciales del javax.security.auth.callback.CallbackHandler interfaz. El manejador de retorno de llamada, com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl. Utilizando esta interfaz, una aplicación puede pasar datos de autenticación a la instancia de módulo de inicio de sesión de WebSphere para realizar la autenticación.
Esta capacidad es sólo para que el código de la aplicación del lado del cliente se autentique en WebSphere Application Server con el Kerberos caché de credenciales.
useDefaultCcache=false
tryFirstPass=false
useFirstPass=false
reenviable=falso
renovable = falso
renovable = falso
sin dirección = falso
javax.security.auth.login.LoginContext lc = null;
String krb5Ccache = /etc/krb5/krb5cc_utle;
try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(user, krb5Realm, krb5Ccache, false));
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determines how authentication data is collected
// in this case, the authentication date is collected by stdin prompt
// and passed to the authentication mechanism implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception:
" + e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resource using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);
// where bankAccount is a protected enterprise bean
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}
Application Server with the default Kerberos credential cache.
javax.security.auth.login.LoginContext lc = null;
try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(user, krb5Realm, null, true));
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determines how authentication data is collected
// in this case, the authentication date is collected by stdin prompt
// and passed to the authentication mechanism implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception:
" + e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resource using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);
// where bankAccount is a protected enterprise bean
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}
Application Server with the Microsoft native Kerberos credential cache. The client must
login to the Microsoft Domain Controller.
javax.security.auth.login.LoginContext lc = null;
try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(null, null, null, true));
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determines how authentication data is collected
// in this case, the authentication date is collected by stdin prompt
// and passed to the authentication mechanism implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception:
" + e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resource using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);
// where bankAccount is a protected enterprise bean
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}Módulo WSKRB5Login
El WSKRB5Login JAAS configuración de inicio de sesión: es genérica JAAS Configuración de inicio de sesión que un cliente Java, una aplicación contenedora de cliente, un servlet, un archivo JSP o un Enterprise Bean pueden utilizar para realizar la autenticación basada en un Kerberos nombre principal contraseña o un Kerberos caché de credenciales al WebSphere Application Server tiempo de ejecución de seguridad. No obstante, esta configuración no da soporte al manejador CallbackHandler especificado en el descriptor de despliegue del contenedor del cliente.
Coloque ya sea elkrb5.ini okrb5.conf archivos que ha creado en una ubicación predeterminada. Si uno de estos dos archivos no se encuentra en la ubicación predeterminada, deberá establecer la propiedad de sistema JVM java.security.krb5.conf con la vía de acceso y el nombre de archivo de configuración de Kerberos correctos.
En una plataforma Windows, la ubicación predeterminada es c:\winnt\krb5.ini.
En una plataforma Linux, la ubicación predeterminada es /etc/krb5.conf.
En otras plataformas Unix, la ubicación predeterminada es /etc/krb5/krb5.conf.
En una plataforma z/OS, la ubicación predeterminada es /etc/krb5/krb5.conf.
Los valores de configuración de Kerberos, el nombre KDC (Key Distribution Center) de Kerberos y los valores de reino se proporcionan en el archivo de configuración de Kerberos o por medio de los archivos de propiedades del sistema java.security.krb5.kdc y java.security.krb5.realm.
Inicio de sesión mediante programa con solicitud de stdin
javax.security.auth.login.LoginContext lc = null;
try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSStdinCallbackHandlerImpl());
// create a LoginContext and specify a CallbackHandler implementation
// CallbackHandler implementation determines how authentication data is collected
// in this case, the authentication date is collected by stdin prompt
// and passed to the authentication mechanism implemented by the LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception:
" + e.getMessage());
e.printStackTrace();
// maybe javax.security.auth.AuthPermission "createLoginContext" is not granted
// to the application, or the JAAS login configuration is not defined.
}
if (lc != null)
try {
lc.login(); // perform login
javax.security.auth.Subject s = lc.getSubject();
// get the authenticated subject
// Invoke a Java EE resource using the authenticated subject
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);
// where bankAccount is a protected enterprise bean
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: "
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();
// login failed, might want to provide relogin logic
}