viernes, 13 de enero de 2012

Metodologías Ágiles, Ecosistema y Reciclaje de Software

Esta es una propuesta que pretende la modernización de los procesos de desarrollo a través de mejoras en partes importantes del desarrollo de software: la metodología y los sistemas de desarrollo.

Para modernización de metodologías propongo la implantación de una de las metodologías ágiles de desarrollo más conocida y utilizada en la actualidad: SCRUM; que además es compatible con las metodologías de calidad actuales (no las sustituye, las complementa).

Como mejora en los sistemas de desarrollo se propone la creación de un ecosistema de software completo que permita la mejora de la calidad y reciclaje de software.


Modernización de la metodología: Metodología y flujo de información ágil

Implantación de dos formas de trabajo que agilicen losdesarrollos:

Implantación de una metodología ágil tipo SCRUM,que puede ser incluida en las ofertas a clientes o pliegos, mejorando dichasofertas. Permite agilizar el desarrollo al separar diseño y construcción, y escompatible con las metodologías de calidad actuales (métrica, CMMI,…).

  • Es un proceso ágil e iterativo que nos ayuda a poner nuestro mayor esfuerzo en entregar el valor más importante de un producto en el tiempo más corto posible.
  • Nos permite enviar, inspeccionar y evaluar periódicamente software funcionando (cada 2-6 semanas aproximadamente).
  • El negocio determina las prioridades, los equipos se auto-administran para encontrar la mejor forma de encontrar las características más prioritarias.
  • Cada 30 días aproximadamente se puede ver software real que funciona y decidir si se entrega así o se sigue refinando en el siguiente ciclo.

Ventajas:

  • Fácil de explicar y entender.
  • Máximo valor por el esfuerzo.
  • Equipos auto-organizados, multi-aprendizaje.
  • Liberación de versiones totalmente funcionales, aunque con funcionalidad limitada, en cada iteración.
  • Orientación al cliente: lo involucra y le permite establecer prioridades.
  • Satisface al cliente con entregas tempranas y continuas de productos parcialmente funcionales.
  • Provee a la gerencia o dirección con un vistazo diario sobre el nivel de productividad y los factores que la afectan.
  • Mayor productividad en el desarrollo de software.
  • Permite producir software de forma regular, consistente y competitiva.
  • Útil en entornos con requisitos inestables, se aceptan requisitos cambiantes, incluso en etapas avanzadas.

La principal desventaja de esta metodología de trabajo esque si se aplica de forma estricta no es aplicable a grandes proyectos, sinembargo, esto se puede resolver dividiendo el desarrollo de aplicacionesgrandes en módulos y separando por equipos y aplicando la metodología por cada equipode desarrollo o/o módulo (sería un SCRUM Modular).

Posteriormente se puede aplicar la metodología ágil en unnivel superior (que podría estar integrado por los analistas o los analistasprogramadores principales de cada grupo) por el cual se realice la comunicacióncon los clientes a través de las reuniones o conferencias que se aplican enesta metodología (SCRUM Jerarquizado).

La potencia de esta metodología se encuentra en laflexibilidad con la que se puede llevar a cabo según interese en cada proyecto,no hay que seguirla de manera estricta.


Modernización de los procesos: Ecosistema de desarrollo y de reciclaje deSoftware

Trataría en realizar la implantación de un ecosistema desoftware completo, en la cual se disponga de algunas de lasherramientas que la integran como son artifactory, jira o HGC, la Wiki…

Existe un grupo de google que habla acerca de este tema: http://groups.google.com/group/ecosistemas-software

Un ecosistema de desarrollo de software (developmentecosystem) es un espacio de trabajo en el que conviven una serie deherramientas que permiten a un equipo de desarrollo modelar una metodología detrabajo que les ayude a ser más eficientes. Un ecosistema de desarrollo desoftware:

-         Facilita la integración continua.
-         Facilita la automatización.

Algunas de las herramientas que pueden ayudar a tal fin sonlas siguientes:

-     Maven: Herramienta de gestión de proyectos desoftware y herramienta de comprensión y gestión de dependencias entrelibrerías. Sería interesante definir arquetipos o plantillas de integración delos proyectos en los repositorios
-     Apache Continuum:Servidor de integración continua, integrable con repositorios de código.Pruebas de calidad y de consistencia.
-     Hudson: Otroservidor, este extensible, para integración continua.
-     Sonar:Plataforma de medición de calidad del código.
-     OpenFire y/opandion: Proporcionan herramientas de servidor y cliente para colaboraciónen tiempo real (Servicios de mensajería corporativa).
-      JUnit: Testeo unitario de aplicaciones.
-      Apache JMeter: Herramienta de prueba de carga, pruebasunitarias o monitoreo.
-      Apache Archiva o artifactory: Repositorios deMaven y Maven2, gestión de dependencias, hace de proxy caché de un repositoriopropio con otros existentes. Habría que integrarlo con el resto de herramientas y utilizarlo como base enel reciclaje de software desarrollado en la empresa, ya sean utilidades(validaciones java por ejemplo), módulos extensibles  (por ejemplo, módulos configurables de integracióncon repositorios LDAP) o productos.
-      Jira o trac: Sistemasde gestión de tareas e incidencias.
-      Wiki: Sitio web cuyas páginas pueden sereditadas rápidamente por múltiples usuarios, donde gestionar la información delos proyecto, utilidades, módulos y productos de la empresa.
-     Repositorio Subversion o GIT: Sistema de control deversiones que mejora el desarrollo colaborativo.


Mejoras de la solución conjunta:

-      Aumenta la productividad y se reduce el tiempo de losdesarrollos:
o       Segúnla metodología SCRUM los desarrollos se pueden empezar en paralelo con eldiseño.
o       Mayorreutilización de código (reciclaje), componentes, soluciones y/o productos quepueden ser compartidos en el Artifactory y documentados en WIKI corporativa.

-      Mejora de la calidad del software: El uso deherramientas de pruebas unitarias JUNIT no es obligatorio, por eso laintegración con herramientas como Sonar puede permitir la evaluación de lacalidad de cada proyecto integrado en artifactory.

-      Mayor grado de implicación y satisfacción del cliente:
o       Mejorael conocimiento del cliente sobre la evolución del proyecto.
o       Elcliente puede ver como evoluciona su producto y hacer pequeñas rectificacionessobre la marcha.

-      Fiabilidad, estabilidad y escalabilidad: se detectanerrores con mayor antelación a lo largo de las distintas etapas de desarrollo,por lo que el producto será mucho mejor y se acercará más a las necesidades delcliente, que haciendo una única entrega al final.

-      Fomenta la colaboración para el desarrollo/evolución de productos quepueden ser vendidos bajo  licencia en el mercado actual o abriendo mercado enotros sitios (si un proyecto es innovador, es más fácil convertirlo enproducto).

lunes, 9 de noviembre de 2009

Nuevas funcionalidades incluidas en Java 6

Voy a hacer un poco de autoaprendizaje, y voy a empezar por la parte principal de mi trabajo (siendo analista j2ee no puede ser otro que el lenguaje Java). Este el primero de lo que espero sea una indeterminada y larga lista de artículos de programación centradas en los entornos de programación basados en Java.

Creo que me había quedado un poco obsoleto y estancado en la versión 5 de este lenguaje, así que decidí dar un paso más y estudiar la versión de Java que se está utilizando ahora mismo en el panorama empresarial: Java 6, o  JDK 1.6 (del JSR 270).

Lo primero sería estudiar las diferencias con la versión anterior, aquí listo las mejoras que proporciona Java 6 con respecto a su anterior versión:

CAMBIOS EN EL CORE
  • Inclusión de motores de scripting: Se incluye el motor de Javascript  Rhino desarrollado por Mozilla.
  • Firma Digital XML (JSR 105): Sin necesidad de utilizar librerías externas (javax.xml.crypto). Esto viene muy bien para firmar peticiones SOAP.
  • API de compilación Java: Permitiría generar código automático en memoria, sin necesidad de fuentes. Esto pienso nos daría mucho juego, tiene muchas posibilidades (tengo que ver si se puede utilizar junto con el API Reflection), permitiendo generar clases dinámicas dependiendo de factores externos como, por ejemplo, datos de configuración o una bade de datos.
  • Procesamiento de anotaciones: Ahora siguiendo el JSR 269 en vez de la JSR 175 de la version 5, se estandariza el procesamiento de dichas anotaciones. Para procesar anotaciones únicamente hay que extender de la clase AbstractProccesor (indicando las anotaciones a capturar) y sobreescribir el método process.
  • Depurador en tiempo de ejecución: Se puede iniciar depuración en tiempo de ejecución, almacenando dentro de las clases compiladas más información que la que se almacenaba anteriormente. Para aplicaciones móviles JME CLDC, esto permite que éstas se ejecuten más rápidamente.
  • Nueva clase ServiceLoader: Permite estandarizar la creación de servicios de proveedores externos, realiza una búsqueda de la implementación de un servicio de forma más sencilla. Hay que indicar la clase que se quiere en el META-INF/services/{paquete.interfaz}. Se puede utilizar como una factoría para una interfaz dada que pueda tener una o varias implementaciones.
  • Colecciones Deque y BlockingDeque: Permiten crear colas doblemente enlazadas (permiten insertar datos al principio o al final). La implementación de la interfaz Deque es ArrayDeque, al cual no se accede a través de su índice. La inserción y obtención tiene un coste menor al de un ArrayList, a no ser que se necesite realizar búsquedas por índice. BlockingDeke, además, da soporte al bloqueo de operaciones de inserción y obtención.
  • Mejoras ordenamiento de colecciones Set y Map: Permitiendo realizar búsquedas bidireccionales y a partir o hasta un elemento dado si los elementos están ordenados (interfaces NavigableSet y NavigableMap).
  • Nueva clase java.io.Console: Permite leer contraseñas sin que se muestre en la pantalla.
  • Inclusión de Base de datos Derby JavaDB.
  • Modificación en la clase File para conocer el espacio en disco y poder cambiar sus atributos.
  • Mejoras en la concurrencia (JSR 166).
  • Inclusión del programa JConsole para monitorización de rendimiento de forma gráfica.
  • Incorporación de un pequeño servidor HTTP.
  • Implementación del manejador de cookies.
  • Internacionalización de los nombre de dominio IDN.
CAMBIOS ORIENTADOS AL CLIENTE
  • Acceso a las aplicaciones nativas.
  • Pantallas Splash.
  • Soporte barra de tareas del sistema.
  • Ordenamiento y filtrado de tablas.
  • SwingWorker.
CAMBIOS ORIENTADOS AL SERVIDOR
  • JDBC versión 4.0.
  • Procesamiento de XML usando StAX.
  • Anotaciones para Servicio Web.
  • Simplificación del mapeo Objeto/XML utilizando JABX 2.0.
  • Simplificación de la exposición de Servicios Web y la creación de clientes usando JAX-WS 2.0.
  • Estandarización de anotaciones comunes.
Son bastantes mejoras y cambios, sin embargo no tan significativos como los que se introdujeron con la versión Java 5 con respecto a su predecesora Java 1.4.

martes, 18 de noviembre de 2008

ConfiguratorPattern

OBJETIVO

En todos las aplicaciones hay funcionalidades básicas e imprescindibles que tienen su mayor defecto la dispersión (funcionalidades no agrupadas que se utilizan en todas partes, en todos los módulos funcionales): trazas, control de excepciones, configuración, multilenguaje...

En este artículo vamos a hacer hincapié en la configuración de una aplicación, que es la base de todo producto, y el mayor problema a la hora de desplegar en diferentes máquinas (quitando problemas de infraestructura) y de administrar versiones según el entorno de destino.

Vamos a intentar plantear un patrón de configuración (ConfiguratorPattern), basado en Java, utilizando buenas prácticas y la experiencia adquirida a lo largo de los años.

Como objetivos voy a intentar que se cumplan los siguientes:
  1. Acceso a cualquier variable de configuración de forma rápida y centralizada.
  2. Permitir el cacheo de la configuración en memoria, para un acceso más rápido.
  3. Permitir el refresco de dicha caché dado un tiempo determinado.
  4. Permitir la instalación y actualización de la aplicación de una manera rápida y lo más independiente del entorno posible.
  5. Impedir que cualquier cambio que se realice en el módulo de configuración pueda afectar al resto de código en el que se encuentra dispersa esta funcionalidad.
     - Estos objetivos implican reducción del acoplamiento y aumento de la cohesión interna del componente -

La configuración de cualquier aplicación basada en tecnología Java puede ser homogenea o heterogenea, es decir, puede estar basada en el mismo soporte (por ejemplo, un fichero xml) o en varios soportes de diferente naturaleza (ficheros de texto o properties, xml o una tabla en base de datos).

Echando a un lado aquellos módulos predefinidos que tienen una forma de generar su configuración de una manera predefinida (por ejemplo, log4j.properties o log4j.xml en trazas de log4j), se debe intentar que el resto de configuración propia del proyecto sea lo más homogenea posible, utilizando siempre el mismo soporte, esto quiere decir utilizar siempre ficheros de propiedades, un fichero xml o una tabla en base de datos.


IMPLEMENTACIÓN

Para cumplir los objetivos que nos hemos impuesto necesitamos una clase como la siguiente:

Datos de configuración obligatorios:
  • allowRefresh: true o false indicando si se debe autorefrescar la configuración
  • refreshTime: Número de minutos entre cada refresco (se actualizará cuando se llame la próxima vez a cualquier variable de configuración)

public final class Configurator {
 // ~ Campos estáticos / Constantes //
 // ------------------------------------------
 private static Map<String, Object> propertiesMap = new HashMap<>();
 private static long refreshTime = 60;
 // En minutos, por defecto una hora
 private static long lastRefreshTime = 0;
 private static boolean allowRefresh = false;

 static { // Se puede inicializar estaticamente o desde alguna clase o listener
  try {
   initialize();
  } catch (Exception ignored) {
  }
 }

 // ~ Métodos //
 // ----------------------------------------------------------------
 /**
  * * Comprueba si es necesario actualizar la configuracion *
  * 
  * @throws ConfigurationException
  */
 private static void refreshConfiguration() throws Exception {
  long currentTime = System.currentTimeMillis();
  if (allowRefresh) {
   if (currentTime > (refreshTime + lastRefreshTime)) {
    initialize();
   }
  }
 }

 /**
  * * Obtiene un subconjunto de propiedades dado un patrón de inicio Por *
  * ejemplo ('animales'): animales.leon animales.cabra animales.camaleon *
  * * @param key * @param pattern * * @return ArrayList * @throws
  * ConfigurationException
  */
 public static List getFilterKeySet(String key, String pattern) {
  List res = new ArrayList();
  try {
   refreshConfiguration();
   if (!pattern.endsWith(".")) {
    pattern = pattern + ".";
   }
   Set keys = ((Map) propertiesMap.get(key)).keySet();
   Iterator e = keys.iterator();
   while (e.hasNext()) {
    String akey = (String) e.next();
    if (akey.startsWith(pattern)) {
     res.add(akey);
    }
   }
  } catch (Exception e) {
   res = new ArrayList();
  }
  return res;
 }

 /**
  * Obtiene un parámetro de configuración del sistema como cadena *
  * @param group 
  * @param key 
  * @return String
  */
 public static String getPropertyAsString(String group, String key) {
  String value = null;
  refreshConfiguration();
  value = (String) ((Map) propertiesMap.get(group)).get(key);
  return value;
 }
 
 /**
  * Obtiene un parámetro de configuración del sistema como [TIPO], * , las
  * que se necesiten de este tipo u otro * * @param group * @param key *
  * @return [TIPO]
  */
 public static TIPO getPropertyAsTIPO(String group, String key){
  TIPO value = null;
  refreshConfiguration();
  value = new TIPO(((Map)propertiesMap.get(group)).get(key).toString());
  return value;
 }

 /** * Inicialización de la configuración de la aplicación */ 
 public static void initialize() throws Exception {
  try {    
   propertiesMap = new HashMap();    
   //CARGAR LOS DATOS DE CONFIGURACIÓN, desde la fuente de datos,    
   // y utilizando un mapa doble y agrupando por grupo    
   while (hayElementos) { 
    propertiesMap.add [....]   ;
   }    
   lastRefreshTime = System.currentTimeMillis();
  } catch (Exception e) {    
    System.out.println("Error al cargar la configuración de la aplicación: " + e);   
    throw e;  
  } 
 }
}


Se aconseja utilizar como soporte de la configuración una tabla en base de datos (la conexión se debe configurar por jndi utilizando la configuración del servidor de aplicaciones: pool de conexiones gestionado por contenedor), de este tipo:

CONFIGURACION (GRUPO, VARIABLE, VALOR, DESCRIPCION) FK (GRUPO, VARIABLE);

De esta forma, en cada entorno con su propia base de datos se podrá desplegar y redesplegar la aplicación las veces que se requieran sin tener que modificar la configuración en dicho entorno (únicamente la primera instalación y breves cambios). Esto viene muy bien si se trata de un producto en continuo desarrollo y se pueden tener diferentes versiones en diferentes clientes.

Hay muchos posibles variantes para este patrón:
  • Utilizando el patrón Factory para crear y obtener la instancia.
  • Utilizando el patrón Singleton en vez de una clase estática.
  • Añadiendo cuantas funciones se necesiten.
  • Cualquiera que no afecte al rendimiento ni la eficiencia de esta funcionalidad.
  • Cargando a la vez las variables allowRefresh y refreshTime desde configuración y actualizando.

martes, 30 de octubre de 2007

Ejecutar el validador automático de formularios de struts desde Ajax

A través de esta clase se podría llamar al validador automático de formularios de struts (que extienden de ValidatorForm) que se configura en el fichero 'validation.xml'.

Es ideal para realizar validaciones de servidor cuando se realiza una petición usando Ajax desde un formulario, aunque se podría incluso usar para forzar la validación desde nuestros propios servlets o actions de Struts.

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorException;
import org.apache.log4j.Logger ;
import org.apache.struts.action.ActionErrors;

public class StrutsFacadeHelper {
private static final Logger log = Logger.getLogger(StrutsFacadeHelper.class);

/**
* Permite validar un formulario o bean que extienda de ValidatorForm
*
* @param formName Nombre del formulario declarado en Struts-config y validation.xml
* @param formBean Objeto ValidatorForm con los datos a validar
* @param sc ServletContext
* @param request HttpServletRequest
* @param errors ActionErrors (a devolver)
*/
public static void ValidateForm (String formName, Object formBean, ServletContext sc, HttpServletRequest request, ActionErrors errors) {
Validator validator = org.apache.struts.validator.Resources.initValidator(formName, formBean, sc, request, errors, 0);

try {
validator.validate();
} catch (ValidatorException e) {
log.error(e.getMessage(), e);
}
}
}

Yo lo he usado con DWR con buenos resultados. He aquí un ejemplo (suponemos que la configuración de DWR y de la clase que ejecuta esta función Ajax está correcta):

public String compruebaUsuarioClaveDWR (String usuario_id, String clave) {...

//Obtenemos el contexto
WebContext ctx = WebContextFactory.get();
HttpServletRequest request = ctx.getHttpServletRequest();
ActionErrors errores = new ActionErrors();

//Obtener formulario
UsuarioForm formulario = new UsuarioForm (usuario_id, clave);

//Validación de servidor del formulario
StrutsFacadeHelper.ValidateForm("usuarioForm", formulario, ctx.getServletContext(), request, errores);

//Comprobar si hay errores
if (errores.isEmpty()) {
//funcionalidad, comprobar usuario - clave
} else {
request.setAttribute (Globals.ERROR_KEY, errores);
return ctx.forwardToString("[URL]/error.jsp"); //o devolver una cadena de errores (o xml) en vez de devolver una página que contenga ......
}

lunes, 26 de febrero de 2007

Aplicaciones Asociadas a SSO en Oracle AS Portal

Integración de Aplicaciones con SSO en Oracle Portal

Indice

Integración de Aplicaciones con SSO en Oracle Portal 1
. 2Indice
1.- Introducción. 3

1.1.- Proteger aplicaciones usando mod_oss. 4

. 62.- Código recomendado para cierre de sesión
. 63.- Código recomendado para abrir sesión
74.- Obtener datos del usuario logado en SSO Server
. 85.- Encriptar y desencriptar cookies de aplicación
6.- Registro de una aplicación asociada en el SSO Server 8

6.1.- Atributos de una aplicación asociada. 10

. 117.- Atributos de usuario pasados a aplicaciones asociadas
8.- Asociar una aplicación a SSO paso a paso. 13

8.1.- Crear la nueva aplicación asociada en el SSO.. 13

8.2.- Creación y configuración de la Base de datos de aplicaciones asociadas. 15
8.2.- Configuración de la aplicación asociada. 17
9.- Bibliografía y documentación. 19


1.- Introducción

Con el fín de integrar varias aplicaciones bajo el mismo sistema de autenticación, Oracle proporciona dos componentes que los desarrolladores pueden utilizar para simplificar el desarrollo en un entorno de aplicaciones empresariales:

· El SSO de Oracle AS permite la autentificación de todos los usuarios mediante un único nombre y contraseña, centralizando la administración de conexión de todos los usuarios.

· El portal de Oracle AS integra datos de fuentes diversas. Las páginas del Portal de Oracle AS controlan el contenido en regiones llamadas portlets que muestran datos de otros sitios Web o aplicaciones.

Oracle Portal permite el intercambio de datos de sesión de SSO a través de cookies y proporciona un SDK, que incluye ejemplos explicativos, para obtener, crear y modificar cookies entre distintas aplicaciones para obtener datos del usuario logado, obtenerlos, modificarlos o crear nuevos datos o, incluso, redireccionar automáticamente a páginas de SSO si es necesario (por usuario no logado, sesión expirada,…) o comprobar las credenciales de acceso. Estas cookies, si existen, poseen datos encriptados.

En conclusión, esta SDK permite interactuar con el servidor SSO de Oracle Portal. El archivo que se debe importar en cada aplicación es “ssosdk902.jar” junto con el “ssosdk902.zip” que viene con código fuente de ejemplo, y se encuentran en la carpeta siguiente:

$INFRA_HOME/sso/lib, donde $INFRA_HOME es el raiz de Oracle Infraestructura

El siguiente diagrama muestra el flujo de información en la integración de aplicaciones con SSO Server:

Aquí se explica paso a paso como el SSO utiliza las cookies para autenticar a usuarios en otras aplicaciones:

  1. Un usuario invoca una aplicación asociada o externa al portal.
  2. La aplicación busca en el navegador del usuario la cookie de login. Si se encuentra presente, autentica al usuario a través de la información cifrada en la cookie. Si la cookie de login no está presente, la aplicación redirecciona de forma transparente hacia la página de autenticación de SSO Server.
  3. El servidor de SSO muestra la página de conexión para aceptar el usuario y contraseña y fija una cookie de conexión o login si las credenciales son válidas.
  4. Después de autenticar al usuario, el servidor de SSO transparentemente vuelve a redireccionar a la aplicación correspondiente usando un URL con un parámetro cifrado que identifica al usuario.
  5. La aplicación asociada debe encargarse de descifrar el parámetro, establecer su propio mantenimiento de la sesión (por ejemplo, determinando qué privilegios debe conceder al usuario), y mantener el sistema de cookies de modo que no se necesite volver a dirigir el flujo al servidor de SSO.

El SSO SDK se puede obtener de la siguiente ruta:

[ORACLE_INFRAESTRUCTURE]/sso/lib/ssosdk902.zip

El javadoc de este paquete lo podemos leer en la siguiente ruta:

http://ftp.unex.es/oradoc/application_server_10g/manage.904/b10422/toc.htm

Es necesario instalar el SSO SDK, siguiendo los pasos del fichero fichero “ReadMe.txt”.

1.1.- Proteger aplicaciones usando mod_oss

En Oracle AS se puede utilizar mod_osso, un módulo de la autentificación del servidor de HTTP de Oracle, que permite el acceso único simple a través de SSO. es un alternativa simple al SSO SDK, usado en otras versiones para integrar aplicaciones. El mod_osso simplifica el proceso de autenticación sirviendo las utilidades del SSO a aplicaciones externas.

Mod_osso puede redireccionar al usuario al módulo de autentificación SSO únicamente si la url llamad se encuentra protegida.

Existe dos métodos de protección usando mod_osso:

· Proteger URLs estáticamente

· Proteger URLs dinámicamente

1.1.1.- Proteger URLs estáticamente

Se utiliza el fichero “mod_osso.conf” situado en la carpeta “%INFRA_HOME%/Apache/Apache/conf” de la carpeta de Oracle AS Infraestructura. En el siguiente ejemplo podemos observar como se protege la url ‘/private’ para que requiera un usuario válido:

AuthType Basic

require valid-user

Ejemplo: http://ftp.unex.es/oradoc/application_server_10g/manage.904/b10852/mod_osso.htm#1006382

1.1.2.- Proteger URLs dinámicamente

Se utilizan cabeceras como las que se muestran en la tabla siguiente:

Directiva

Código de estado

Cabeceras

Petición de autenticación

401, 499

-

Petición forzada de autenticación

499

Osso-Paranoid:true

Single Sign-Off

470

Osso-Return-URL

Esta es la URL de retorno despues de completar el ‘single sign-on’

Ejemplo: http://ftp.unex.es/oradoc/application_server_10g/manage.904/b10852/mod_osso.htm#1006437

2.- Código recomendado para cierre de sesión

// Clear application session, if any

String l_return_url := return url to your application e.g. home page

response.setHeader( "Osso-Return-Url", l_return_url);

response.sendError( 470, "Oracle SSO" );

3.- Código recomendado para abrir sesión

// Get user name from application session. This session was

// established by the application or OC4J session

String username = request.getSession().getAttribute('USER_NAME');

// Get subscriber name from application session. This session was

// established by the application or OC4J session

String subscriber = request.getSession().getAttribute('SUBSCRIBER_NAME');

// Get user security information from application session. This session // was

established by the application or OC4J session

String user_sec_info = request.getSession().getAttribute('USER_APP_SEC');

// Get username and subscriber name from JAZN API */

JAZNUserAdaptor jaznuser = (JAZNUserAdaptor)requset.getUserPrincipal();

String ssousername = jaznuser.getName();

String ssosubscriber = jaznuser.getRealm().getName();

// If you are not using JAZN api then you can also get the username and

// subscriber name from mod_osso headers

String ssousername = request.getRemoteUser();

String ssosubscriber = request.getHeader('OSSO-SUBSCRIBER');

// Check for application session. Create it if necessary.

if((username == null) || (subscriber == null) )

{

...Code to create application session. Get the user information from

JAZN api(or mod_osso headers if you are not using JAZN api) and populate

the application session with user, subscriber and user security info...

}

if((username != null)&&(subscriber != null)

&&(ssousername != null)&&(ssosubscriber != null)

&&(username.equalsIgnoreCase(ssousername) == 0 )

&&(subscriber.equalsIgnoreCase(ssosubscriber) == 0))

{

// Show personalized user content

show_personalized_page(username, subscriber, user_sec_info);

}

else

{

...Code to Wipe-out application session, followed by...

// Send Dynamic Directive for login

// If you are using JAZN then you should use following code

// response.sendError( 401);

// If you are not using JAZN api then you should use following code

// response.sendError( 499, "Oracle SSO" );

}

4.- Obtener datos del usuario logado en SSO Server

Al obtener de la sesión el usuario de tipo SSOUserInfo, podemos leer de él la siguiente información:

Method Summary

java.lang.String

getIPAddress()
Returns the IP address of the user's computer.

java.lang.String

getLocale()
Returns locale information.

int

getSSOTimeRemaining()
Returns the remaining session time.

java.lang.String

getSSOUserName()
Returns the authenticated user name.

java.lang.String

getSubscriberDN()
Returns the directory DN of the subscriber.

java.lang.String

getSubscriberGuid()
Returns the directory GUID of the subscriber.

java.lang.String

getSubscriberName()
Returns the subscriber name.

java.lang.String

getUrlRequested()
Returns the requested URL.

java.lang.String

getUserDN()
Returns the directory DN of the user.

java.lang.String

getUserGuid()
Returns the directory GUID of the user.

5.- Encriptar y desencriptar cookies de aplicación

La clase del SSO SDK, SSOEnabler.class, posee los siguientes métodos de encriptación que habrá que invocar cuando se cree o lea cualquier cookie de sesión:

java.lang.String decryptCookie(java.lang.String p_listenerToken, java.lang.String p_encryptedCookie)

java.lang.String encryptCookie(java.lang.String p_listenerToken, java.lang.String p_appCookie)

6.- Registro de una aplicación asociada en el SSO Server

En la siguiente ruta deberemos dar de alta nuestra aplicación para incluirlo en el sistema de acceso único de SSO Server, con los parámetros asociados correspondientes:

http://[SERVIDOR]:[PUERTO]/pls/orasso/orasso.home

El puerto por defecto suele ser el 7777. El acceso se debe de realizar con el usuario administrador (orcladmin). Una vez iniciado aparecerá la siguiente pantalla:

Pulsamos el enlace ‘Administrador del Servidor SSO’ y nos aparece la siguiente pantalla:

Seleccionamos ahora ‘Administrar Aplicaciones Asociadas’. Nos aparece:

Pulsamos ‘Agregar Aplicación Asociada’ y escribimos todos los datos que nos solicitan, nos creará unas URLs de conexión y desconexión automáticamente:

6.1.- Atributos de una aplicación asociada

Para el login:

Field

Description

Name

Enter a unique name for the partner application.

Home URL

Enter the URL of the home page for the application.

Success URL

Enter the URL to the routine responsible for establishing the partner application's session and session cookies. This routine should redirect the browser to the URL that the user originally requested.

The URL must point to a procedure that processes the user identification information from the single sign-on server. Include the http:// prefix in the URL. The following example shows a success URL for OracleAS Portal:

http://server.domain.com:5000/pls/DAD/portal.wwsec_app_priv.process_signon

Logout URL

Enter the URL for the logout routine of the application. The single sign-off page invokes this URL in parallel with others, enabling users to simultaneously log out of the server and active partner applications.

Para las franjas de validez de login integrado en SSO Server:

Field

Description

Start Date

Enter the date when users are first able to access the partner application through the single sign-on server. Use the format shown next to the field label.

End Date

Enter the date when users are last able to access the partner application through the single sign-on server. Use the format shown next to the field label.

Note: If you leave this field blank, this partner application is valid for an indefinite period.

Para los daos del administrador de la aplicación:

Field

Description

Administrator E-mail

Enter the e-mail address of the administrator of the partner application.

Administrator Information

Enter any additional information that you want to include about the administrator of the partner application.

7.- Atributos de usuario pasados a aplicaciones asociadas

Listado de todos los atributos que ‘mod_osso’ pasa a las aplicaciones asociadas:

HTTP Header Name

Description

Source

Use as Key or Handle?

Osso-User-Guid

Single sign-on user's globally unique user ID (GUID)

Single sign-on user's globally unique user ID (GUID)

Recommended

Osso-Subscriber-Guid

Realm GUID

Realm entry in Oracle Internet Directory

Recommended

Remote-User

User nickname as entered by user on the login page

Single sign-on login page

Recommended for pre-9.0.4 applications, but not for 9.0.4 applications.

Osso-Subscriber

User-friendly name for a realm

Realm entry in Oracle Internet Directory

Recommended for pre-9.0.4 applications, but not for 9.0.4 applications.

Accept-Language

Language and territory in ISO format

Single sign-on server

Not applicable

Osso-User-Dn

Single sign-on user's distinguished name (DN)

User entry in Oracle Internet Directory

Not recommended. Use GUID headers to perform user searches in Oracle Internet Directory. Deprecated.

Osso-Subscriber-DN

Realm DN

Realm entry in Oracle Internet Directory

Not recommended. Use GUID headers to perform user searches in Oracle Internet Directory. Deprecated.

8.- Asociar una aplicación a SSO paso a paso

Para asociar una aplicación a SSO hay que seguir los siguientes pasos, no necesariamente en el mismo orden:

8.1.- Crear la nueva aplicación asociada en el SSO

· Acceder a la consola de administración de SSO, normalmente se encuentra en la siguiente ruta:

http://[HOST_INFRAESTRUCTURA]:7777/pls/orasso/ORASSO.home

Por ejemplo,

http://localhost:7777/pls/orasso/ORASSO.home

· Conectar con el usuario ‘orcladmin’, aparecerá mas o menos la siguiente ventana:

· Entrar en la opción ‘Administración del servidor SSO’, luego en ‘Administrar Aplicaciones Asociadas’ y, por último, en ‘Agregar Aplicación Asociada’, Debemos ver algo tal que así:


· Rellenamos los datos de nuestra aplicación, para ello debemos tener en cuenta que en las urls de conexión y desconexión, debemos poner la ruta a los jsps o servlets proporcionados por el ejemplo que indicaremos más adelante (ssodemo).

· La aplicación generará automáticamente una serie de parámetros que debemos apuntar pues nos servirán más adelante:

o Identificador

o Elemento

o Clave de Cifrado

o URL de Conexión

o URL de Desconexión Única

Podemos consultarlos pulsando sobre el enlace ‘editar’ de nuestra aplicación asociada, creada anteriormente:

8.2.- Creación y configuración de la Base de datos de aplicaciones asociadas

Es necesario instalar o tener una instancia accesible de la base de datos para aplicaciones asociadas, cuyos scripts de instalación se proporcionan en el paquete ‘ssosdk902.zip’. Seguir los siguientes pasos para su configuración:

· Si no existe se instala creando un esquema nuevo o utilizando uno existente, según los scripts del paquete de desarrollo de sso.

· Una vez creado hay que ejecutar sobre dicha base de datos el siguiente script, también existente en dicho paquete, para instalar la aplicación anteriormente dada de alta el el administrador de SSO de Oracle: regapp.sql.

A continuación ponemos las sentencias a ejecutar para su comodidad:

PROMPT

PROMPT Partner Application Configuration

PROMPT

PROMPT

declare

l_listener_token varchar2(255);

l_site_token varchar2(255);

l_site_id varchar2(255);

l_login_url varchar2(2000);

l_logout_url varchar2(2000);

l_cookie_version varchar2(80);

l_encryption_key varchar2(1000);

l_ip_check varchar2(1);

begin

l_listener_token := '&Listener_Token';

l_site_id := '&Site_ID';

l_site_token := '&Site_Token';

l_login_url := '&Login_URL';

l_cookie_version := 'v1.2';

l_encryption_key := '&Encryption_Key';

l_ip_check := '&IP_Check';

begin

wwsec_sso_enabler.delete_enabler_config

(

p_lsnr_token => l_listener_token

);

exception

when others then null;

end;

wwsec_sso_enabler.create_enabler_config

(

p_lsnr_token => l_listener_token

,p_site_token => l_site_token

,p_site_id => l_site_id

,p_ls_login_url => l_login_url

,p_ls_logout_url => ''

,p_url_cookie_version => l_cookie_version

,p_encryption_key => l_encryption_key

,p_ipaddr_check => l_ip_check

);

wwsec_sso_enabler.get_enabler_config

(

p_lsnr_token => l_listener_token

,p_site_token => l_site_token

,p_site_id => l_site_id

,p_ls_login_url => l_login_url

,p_ls_logout_url => l_logout_url

,p_url_cookie_version => l_cookie_version

,p_encryption_key => l_encryption_key

,p_ipaddr_check => l_ip_check

);

dbms_output.put_line('------------------------------------------------ ');

dbms_output.put_line('Registration successful. ');

dbms_output.put_line('Listener token: ' || l_listener_token);

dbms_output.put_line('Site id : ' || l_site_id);

dbms_output.put_line('Site token : ' || l_site_token);

dbms_output.put_line('Encryption key: ' || l_encryption_key);

dbms_output.put_line('Login URL : ' || l_login_url);

dbms_output.put_line('Logout URL : ' || l_logout_url);

dbms_output.put_line('IP check : ' || l_ip_check);

dbms_output.put_line('------------------------------------------------ ');

exception

when others then

dbms_output.put_line('------------------------------------------------ ');

dbms_output.put_line('ERROR: Error in registration. Please try again');

dbms_output.put_line(sqlerrm);

dbms_output.put_line('------------------------------------------------ ');

end;

/

commit;

Durante la ejecución de estas sentencias se le solicitará una serie de parámetros cuya relación con los campos que se definieron en el punto 8.1, es la siguiente

CAMPO SOLICITADO

DATO RELACIONADO

LISTENER_TOKEN

NOMBRE DEL SERVIDOR

(Por ej., sev-des-app.tb-solutions.com)

SITE_ID

IDENTIFICADOR, de la conexión a la aplicación asociada (Por ej., 52F81BF5)

SITE_TOKEN

ELEMENTO, de la conexión a la aplicación asociada (Por ej., 87TIUG4K52F81BF5)

LOGIN_URL

URL DE CONEXIÓN, de la conexión a la aplicación asociada (Por ej., http://localhost:7777/pls/orasso/ orasso.wwsso_app_admin.ls_login)

ENCRYPTION_KEY

CLAVE DE CIFRADO, de la conexión a la aplicación asociada (Por ej., 95A79762E9BA8D18)

IP_CHECK

Y o N, indica si se debe filtrar por IP las cookies o no. Poner por defecto N.

8.2.- Configuración de la aplicación asociada

· Importar la librería ‘ssosdk902.jar’ proporcionada por el SDK de SSO.

· Importar la librería para realizar consultar con la base de datos de aplicaciones asociadas.

· Ver los ejemplos que posee el SDK de SSO y crearse una solución a medida.

· Por último, ya que podemos probar la sesión y obtener el usuario dado de alta en SSO, deberemos obtener dicho usuario y habilitar o deshabilitar permisos sobre páginas privadas para dicho usuario según la funcionalidad requerida. Todo el control de permisos en este caso lo debe realizar la aplicación asociada correspondiente. Sería conveniente crear un servicio de comprobación de permisos de usuarios o que sirva para relacionar los usuarios de SSO con los propios de la aplicación asociada.

9.- Bibliografía y documentación

Using Oracle9iAS Single Sign-On

http://www.oracle.com/technology/sample_code/products/iportal/htdocs/sso/ssoover.html

Writing Partner Applications Using Java APIs

http://www.di.unipi.it/~ghelli/didattica/bdl/A97329_03/manage.902/a96114/examples.htm#1002397

Oracle® Application Server Single Sign-On Application Developer's Guide

http://ftp.unex.es/oradoc/application_server_10g/manage.904/b10852/toc.htm

Adding Partner and External Applications

http://12.46.245.173/help/wvpartnr.htm

Oracle9iAS Single Sign-On Administrator's Guide

http://www.di.unipi.it/~ghelli/didattica/bdl/A97329_03/manage.902/a96115/toc.htm

Imágenes Dockers

Estoy aprendiendo bastante sobre el tema de docker y docker swarm , gestión de Stacks, Servicios, Containers, Volumenes, .. y sus configurac...