En anteriores post, hemos visto algunos de los patrones que son parte del GOF. Pero como una imagen vale más que mil palabras, aquí les dejo este link en donde podrán encontrar un excelente PDF con los diagramas UML de los principales patrones.
Esta no es la única opción, ya que también existe el poster de Head Fisrt Design Patterns, pero que a diferencia de la opción anterior, esta utlima es pagada.
Este es un poster que Cerebro no puede dejar de tener!!
viernes, 22 de agosto de 2008
jueves, 21 de agosto de 2008
SCWCD - El descriptor de despliegue web.xml
El archivo web.xml proporciona la configuración y el despliegue de información para los componentes web que conforman una aplicación.
Este archivo debe residir en el directorio WEB-INF dentro del contexto de la jerarquía de directorios que existen para una aplicación Web. Por ejemplo, si la aplicación esta empaquetada en el archivo WAR "dukechile.war", el archivo web.xml se debe colocar en el directorio “dukechile/ WEB-INF”.
Como todos los archivos de configuración xml, este contiene un esquema que describe el contenido del fichero xml y la descripción de las propiedades que va a utilizar. Dentro de este archivo definiremos la configuración de la aplicación web que estemos desarrollando.
Los elementos del web.xml son:
<web-app>: Es el elemento raíz del fichero xml.
<icon>: Define la ruta para las imágenes asociadas a los iconos pequeño y grande que representan a la aplicación.
<display-name>: Es el nombre que representará a la aplicación dentro de las herramientas del servidor de aplicaciones, no es un nombre funcional.
<description>: Texto descriptivo de la aplicación, que al igual que las dos anteriores propiedades, sólo es representativo.
<context-param>: Permite configurar parámetros de inicialización del contexto de nuestra aplicación web.
<filter>: Permite definir un filtro en la aplicación.
<filter-mapping>: Define un mapeo para aplicar las reglas de un determinado filtro a una URL.
<listener>: Permite definir una clase oyente, la que puede escuchar eventos relacionados al clico de vida de la aplicación o modificaciones de un objeto.
<servlet>: Permite definir la configuración de nuestros servlets.
<servlet-mapping>: Permite relacionar los servlets que hemos declarado con las URL que van a escuchar.
<session-config>: Permite definir el timeout de la sesión en minutos.
<mime-mapping>: Permite definir una relación entre las extensiones y los tipos mime.
<welcome-file-list>: Permite definir los ficheros de bienvenida de la aplicacion.
<tag-lib>: Permite definir las librerías de etiquetas de los ficheros JSP.
<jsp-property-group<: Permite definir propiedades para un conjunto de JSP que cumplan un patrón.
<error-page<: Permite asociar errores HTML y excepciones lanzadas por nuestra aplicación a páginas de error personalizadas para la aplicación.
<resource-ref<: Permite declarar recursos externos que nuestra aplicación va a utilizar. Por ejemplo, una conexión a una base de datos.
<resource-env-ref<: Permite declarar recursos externos que nuestra aplicación va a utilizar. Este elemento es una nueva variación del elemento añadido en Servlet 2.4 que es más simple de configurar para recursos que no necesitan información de autenticación.
<security-role<: Permite definir los roles de usuarios que se van a utilizar en la aplicación.
<ejb-ref<: Permite definir una referencia a un EJB.
<ejb-local-ref<: Permite definir una referencia a un EJB Local.
<distributable<: Permite definir que la aplicación puede correr en un ambiente cluster.
miércoles, 20 de agosto de 2008
SCWCD - Seguridad en aplicaciones Web
Uno de los tópicos que se debe estudiar para la certificación SCWCD (Sun Certified Web Component Developer) son los mecanismos de seguridad en las aplicaciones Web.
Mecanismos de seguridad
La seguridad en los servlets se reduce a cuatro conceptos principales:
- authentication: El proceso de autenticación es el encargado de determinar que el interesado en acceder los recursos es realmente quien dice que es. Lo más común es hacer que el usuario o la aplicación envié un password que lo identifica.
- authorization: Es el proceso por el cual se restringe el acceso a ciertos recursos a un conjunto de clientes. En realidad, lo que se define es un conjunto de roles que pueden acceder a ciertos recursos y se asocia cada usuario a uno o más roles.
- data integrity: Es el proceso que asegura que los datos que se reciben (tanto el cliente como el servidor) no han sido corrompidos. Generalmente se usan algoritmos de encriptación para lograr esto.
- confidentiality: Es el proceso que intenta asegurar que solamente los clientes autorizados reciban la información. La manera de lograr esto puede ser a través del uso de claves públicas/privadas.
Tipos de autentificación definidos
La especificación de servlet ofrece cuatro tipos de autentificación:
- BASIC: Este es el método más simple, pero el más inseguro. Cuando usamos este tipo de autenticación, se abre una ventana en el browser del cliente para que este ingrese el usuario y el password. El password se envía al servidor codificado en Base64.
- FORM: Este método es similar a BASIC, pero utiliza un formulario provisto por el programador. Este formulario tiene que cumplir los siguientes requisitos:
- El atributo “action” debe ser “j_security_check”
- El casillero de ingreso del usuario debe llamarse “j_username”
- El casillero de ingreso del password debe llamarse “j_password”
- CLIENT-CERT: En este método se usan certificados digitales. El browser debe tener instalado el certificado para que la comunicación se pueda establecer.
- DIGEST: La autenticación también es hecha utilizando usuario y password, pero el password es enviado encriptado de una forma mucho más segura (por ejemplo, utilizando HTTPS client authentication).
Autorización
El primero paso es definir los roles que se encontraran definidos dentro de nuestro sistema. Para el caso de Tomcat, estos se definen en el archivo tomcat-users.xml. Dentro de este archivo, cada usuario tiene asignado un usuario y password; y puede estar asociado a uno o más roles.
El siguiente paso es relacionar los roles definidos en el archivo tomcat-users.xml, con los roles a utilizar dentro del sistema. Para esto deberemos utilizar los elementos <security-role> y <role-name> dentro del archivo web.xml.
Una vez definidos los roles, se procede a establecer “declarativamente” el acceso a un conjunto de recursos en combinación con los métodos, a los cuales tendrán accesos determinados roles. El elemento principal es el <security-constraint>.
Donde:
- El elemento <web-resource-name> es obligatorio y utilizado principalmente por los IDEs.
- El elemento <url-pattern> define el recurso al cual se limitara el acceso. Al menos se debe definir a lo menos un <url-pattern>.
- El elemento <http-method> describe el método HTTP que será restringido para acceder al recurso definido en los <url-pattern>. Si no se define ningún <http-method>, entonces se restringirá el acceso a todos los métodos HTTP.
- El elemento <auth-constraint> es opcional y permite definir cuales roles pueden llamar a los métodos HTTP restringidos por los elementos <http-method>
Para permitir el acceso a todos los roles, se debe definir el elemento <auth-constraint> de la siguiente forma:
O también de la forma:
En el caso de que se quiera bloquear el acceso a todos los roles, se deberá definir el <auth-constraint> de la siguiente forma:
Es importante tener en cuenta que se puede tener más de un elemento <web-resource-collection> dentro de un <security-constraint>. En este caso, el elemento <auth-constraint> se aplica a todos los <web-resource-collection> definidos dentro de un <security-constraint>.
Autentificacion
Anteriormente mencionamos que la especificación de servlet ofrece cuatro tipos de autentificación: BASIC, FORM, CLIENT-CERT y DIGEST.
Cada uno de estos tipos se puede definir en el web.xml de siguiente forma:
Un punto importante es que de los cuatro tipos de autentificación, el tipo DIGEST es el único que es opcional para los contenedores JEE.
Modos de transporte
La especificación también define tres modos para indicar la seguridad del transporte de los datos a través de la Web.
- NONE: Ningún tipo de cifrado, simplemente HTTP.
- CONFIDENTIAL: Define la confidencialidad de los datos. Es decir, que nadie pueda ver ni modificar los datos que se envían.
- INTEGRAL: Define la integridad de los datos. Es decir, que aunque alguien pueda ver lo que se envía, se garantice que los datos no se modifiquen por el camino.
El metodo isUserInRole()
La clase “HTTPServletRequest” tiene tres métodos que están asociados al manejo de la seguridad de manera “programática”, uno de estos es el método “isUserInRole”.
A través del método “isUserInRole()”, en vez de manejar el acceso a nivel de método HTTP, ahora podremos autorizar el acceso a una parte del código de nuestro método basados en los roles del usuario.
Antes de que se llame al método “isUserInRole()”, el usuario necesita estar autenticado. En el caso de que llame al método sobre un usuario que no ha autenticado, el contenedor retornara “false”.
En el caso de que este autenticado, el contenedor toma el argumento del método y compara este con los roles definidos para el usuario en el “request”.
Si el usuario es mapeado a este rol, el contenedor retornara “true”.
Por ejemplo, dentro del código en el servlet:
El elemento <security-role-ref> permite relacionar un <role-name> definido “programáticamente” (en el servlet) con uno que existe en el web.xml.
martes, 19 de agosto de 2008
JMesa
Muchos desarrolladores Web, alguna vez hemos utilizado DisplayTag para la creación de tablas con exportación y paginación automática. DisplayTag es un tag lib que nos permite ahorrar muchas líneas de código.
Ahora disponemos de una alternativa mucho más actualizada y potente llamada JMesa.
Los pasos para agregar JMesa a sus aplicaciones son muy simples.
Descargan JMesa desde aquí y agregan el tld que se encuentra bajo el directorio /jmesa-2.3.3/dist del zip al directorio /WEB-INF/tld de la aplicación.
También deberan agregar los ficheros css, javascript, las imágenes y por supuesto los jar en sus directorios correspondientes. Como JMesa requiere de JQuery, también deberán agregarlo al directorio js ( JQuery lo pueden obtener desde aquí). No importa donde se coloquen los css ni los javascript dado que se configuraran posteriormente. Las imágenes sin embargo tienen que estar en una ruta determinada que ha de coincidir con la del valor de la clave html.imagesPath especificada en el fichero jmesa.properties.
Este último fichero hay que crearlo y referenciarlo en el web.xml:
A continuación, deberán crear el archivo jmesa.properties en el directorio WEB-INF de la aplicación.
Con estos pasos, ya se encuentra listo y configurado. Para utilizarlo hay que definir el namespace de JMesa en nuestra página:
Ahora simplemente definiremos la siguiente línea:
Con estos simples pasos, ya podremos utilizar JMesa dentro de nuestros proyectos.
domingo, 17 de agosto de 2008
El patrón “Cadena de Responsabilidad” (Chain of Responsibility) - Parte VI
Los últimos ataques han sido todo un éxito, cada día se logran nuevas conquistas!!!. Debido a esto, Cerebro se ha visto en la necesidad de aumentar el número de robots dentro de sus tropas. Ahora su ejército se encuentra organizado en una estructura jerárquica, para lo cual ascendió a sus mejores solados a rangos como “General” o “Coronel”.
Con esta nueva estructura será mucho fácil dar órdenes a su ejército, el simplemente dará la orden a su “General Mazinger Z” quien al leer el comunicado decidirá si debe ejecutarla el o deberá derivarla a un sub-alterno; y así sucesivamente en la jerarquía hasta llegar al “Soldado El Galactico”.
Genial…..como siempre este plan es simple……es magnífico……es perfecto…….pero!!!!!!!
Cerebro se ha dado cuenta nuevamente que ha olvidado algo muy importante, su mecanismo de comunicación (implementado con el patrón “Observador”) ya no le sirve. Ahora tiene una estructura jerárquica, y necesita que la orden pase a través de esta estructura hasta el sub-alterno al que se le desee enviar este mensaje. Por lo tanto necesita un mecanismo en el cual el receptor del mensaje pueda no solo ejecutar la orden, sino también poder comunicar esta a su sub-alterno en el caso de que no fuera dirigida a él.
Una solución sería ir replicando el patrón “Observador” en cada uno de sus niveles jerárquicos, pero esta no es la solución más optima..
Debido a todos estos problemas, recurre nuevamente a su gurú “Martin Fowler” y encuentra la solución perfecta!!!!. Cerebro ha visto que el patrón “Cadena de Responsabilidad” (Chain of Responsibility) es ideal para solucionar su problema.
Primero necesitara definir la clase “Mensaje”, la cual contendrá a quien esta dirigida la orden y cuáles son las instrucciones a ejecutar.
Luego, deberá definir la clase abstracta “EjecutarOrdenAltoMando”, la cual deberán extender cada uno de los elementos de su ejército.
Ahora, cada sub-alterno que extienda la clase abstracta, deberá definir un mecanismo que permita discriminar si la orden enviada la debe ejecutar el, o en caso contrario, enviar la orden a su sub-alterno.
Finalmente, será muy fácil para Cerebro enviar un mensaje a su ejército, el simplemente dará la orden a su “General” y listo!!
Cerebro lo ha conseguido nuevamente, ha logrado diseñar un nuevo mecanismo de comunicación para su ejército, continuando su malvado plan………“TRATAR DE CONQUISTAR AL MUNDO!!!!”
Categorias:
Patrones de Diseño
Suscribirse a:
Entradas (Atom)
