Seguridad en Aplicaciones Web Fusion - Oracle ADF (Parte III)

Por Marcelo Vásquez
Publicado en marzo 2012


Los artículos que conforman esta serie son los siguientes:

En los artículos anteriores vimos como configurar el Weblogic para agregar un “provider” de seguridad para autentificar nuestras aplicaciones desplegadas en Weblogic. También vimos como configurar ADF Security en nuestra aplicación ADF para que utilice la seguridad definida en el Weblogic, generando una integración totalmente transparente.

En este artículo como el final de una serie dedicada a la seguridad vamos a ver cómo crear una pantalla de LOGIN personalizada, usando nuestra propia pantalla para ingresar el usuario y la clave.

Descarga aquí el proyecto de ejemplo usado en este artículo.

Contexto Inicial

Quiero destacar que el artículo anterior es de utilidad y en este vamos a modificar alguna configuración sobre nuestra aplicación ADF para poder dar lugar a la pantalla de LOGIN personalizada. Pero será necesario tener el proyecto tal como se indico en el artículo previo.

Definir el Task-Flow principal

Vamos a empezar definiendo el nuestro adfc-config.xml como se indica en la siguiente figura:

Definir el Task-Flow principal

En la imagen podemos observar las pantallas:

• login.jspx, esta es nuestra pantalla con el login personalizado, en donde ingresaremos usuario y clave.
• bienvenido.jspx, esta pantalla muestra un mensaje de bienvenida, el usuario autentificado (si es que fue exitoso el acceso) y un botón para navegar hasta el task-flow “task-flow-empleados”.
• empleados, es la pantalla que posee el task-flow “task-flow-empleados”, en donde se muestra por defecto el listado de empleados.
• error.jspx, es la pantalla que muestra un mensaje de error cuando el usuario autentificado posee un ROL que no tiene acceso a dicha pantalla.

Atrapar la excepción de falta de AUTORIZACIÓN

Si observamos con detalle la imagen del task-flow principal, vemos que error.jspx posee un icono en rojo (boton rojo ) este icono indica que es pantalla es utilizada para el “Exception Handler” del task-flow principal. Para definir que pantalla será usada en el “Exception Handler” debemos configurar el task-flow principal como se indica en la siguiente figura:

Atrapar la excepción de falta de AUTORIZACIÓN

En realidad cualquier excepción producida en el task-flow principal el Handler la atrapará y mostrará la pantalla “error.jspx” en este caso usaremos esta característica para la excepción que se genera cuando el usuario posee un ROL que no tiene acceso a la pantalla que intenta acceder.

Modificar la configuración del ADF Security

En el artículo anterior al utilizar el wizard para configurar la seguridad en el momento de elegir el tipo de autentificación, esto es justo lo que vamos a modificar.

Lo que debemos hacer es volver a iniciar el Wizard e ir directamente hasta el paso 2 “Authentication Type” y elegimos la opción “Form-Based Authentification” y completamos el “Login Page” y “Error Page” tal como se indica en la siguiente figura:

Modificar la configuración del ADF Security

Crear un Managed Bean para la pantalla de login.jspx

El siguiente paso es crear un managed bean que lo que hace es recuperar de la pantalla de login.jspx y autentificar contra la seguridad definida en el Weblogic.

El managed bean posee los siguientes import:

Crear un Managed Bean para la pantalla de login.jspx

El managed bean posee los siguientes 2 atributos con sus accesors set() y get() respectivos:

atributos con sus accesors set y get

El managed bean debe poseer los siguientes métodos:

doLogin(): se agregaron comentarios en el código para un mejor entendimiento.

doLogin

Métodos sendForward() y reportUnexpectedLoginError(): estos métodos privados son auxiliares y cumplen una función determinada.

Métodos sendForward y reportUnexpectedLoginError

Por último queda registrar el managed bean en el adfc-config.xml, debemos hacerlo tal como indica en la figura:

registrar el managed bean en el adfc-config.xml

Página login.jspx, error.jspx y bienvenida.jspx

En el siguiente código de la página se puede ver como se hace uso de los atributos del manage bean “AccesoBean.java” y del método doLogin() relacionado al botón para autentificar.

registrar el managed bean en el adfc-config.xml

registrar el managed bean

registrar el managed bean

En la página de bienvenida.jspx se puede ver en la línea 22 y 24 algunas expresiones EL que son muy útiles para poder saber con simples expresiones el usuario que está autentificado o si esta autentificado.

La aplicación corriendo

Es importante antes de correr la aplicación asegurarse de que las pantallas login.jspx, error.jspx y bienvenida.jspx sean páginas que no tengan pageDefinition relacionados en el DataBinding.cpx, ya que son públicas y si ADF Security realiza la autorización sobre las páginas jspx con pageDefinition y sobre los task-flow.

A continuación mostraré algunas capturas de pantallas de la aplicación corriendo.

Tema adicional: expresiones EL de ADF Security

Es muy recomendable utilizar las expresiones EL de ADF Security cuando necesitamos realizar algún control o verificación relacionado a la seguridad en la vista.

También poseemos las clases necesario en Java para poder obtener información de la seguridad a nivel de ADF Business Componente (Entities, View Objects y Application Modules).

A continuación listaré algunas expresiones que son muy usadas:

#{securityContext.userName}:
retorna el nombre de usuario autentificado
#{securityContext.authenticated}:
retorna true si el usuario esta autentificado
#{securityContext.userInRole['roleList']}:
retorna true si el usuario posee un ROL dentro de la lista que recibe como parámetro
#{securityContext.userInAllRoles['roleList']}:
retorna true si el usuario posee todos los ROLES dentro de la lista que recibe como parámetro, si le falta alguno retorna falso

 

Para finalizar mostraremos la forma de recuperar el usuario de ADF Security desde una clase java:

String usuario = ADFContext.getCurrent().getSecurityContext().getUserName();

Ventajas

Mencionamos algunas ventajas de ADF Security:

- No solo la integración entre los providers de seguridad y las aplicaciones ADF es transparente y fácil, sino también que es muy sencillo realizar una personalización - Se gana más control sobre los fallos de autentificación o autorización, pudiendo generar mensajes más personalizados - Posibilidad de utilizar EL para acceder a los métodos de ADF Security - Posibilidad de usar clases java de ADF Security para acceder al contexto de Seguridad y utilizar los métodos desde otras clases java. - El contexto de seguridad llega hasta ADF Business Component

Referencias

- http://docs.oracle.com/cd/E14571_01/web.1111/b31974/adding_security.htm




Publicado por Marcelo Vásquez. Especialista en Java y Oracle ADF, posee más de 13 años de experiencia en tecnologías ORACLE. Se desempeña como consultor, arquitecto y capacitador en JSDK, JEE, Frameworks y Oracle ADF.