Estándar de desarrollo e implantación de aplicaciones del Govern de les Illes Balears ESTÁNDARES DE SISTEMAS JEE Versión: 6.0 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Índice de contenidos INTRODUCCIÓN .............................................................................................................................................3 ESTÁNDAR DE DESARROLLO DE APLICACIONES JEE ....................................................................................4 NOMENCLATURA DE APLICACIONES JEE ......................................................................................................5 NOMENCLATURA DE CLASES....................................................................................................................................5 Jerarquía de paquetes..................................................................................................................................5 Nomenclatura de clases...............................................................................................................................6 Nomenclatura de métodos..........................................................................................................................6 NOMBRES DE APLICACIÓN......................................................................................................................................6 NOMBRES DE LOS JAR........................................................................................................................................7 ARQUITECTURA DE APLICACIONES..............................................................................................................7 SERVICIOS DE DIRECTORIO DEL SERVIDOR DE APLICACIONES...................................................................................................7 ACCESO A BASES DE DATOS......................................................................................................................................7 MÓDULOS JSP/JSF, SERVLETS Y ENTERPRISE JAVA BEANS..................................................................................................8 SEGURIDAD DE APLICACIONES..................................................................................................................................9 Elemento <login-config>..............................................................................................................................9 Elemento <security-role>.............................................................................................................................9 Elemento <security-constraint>..................................................................................................................10 Protección de EJBs....................................................................................................................................10 Declaración de dominios de seguridad en Jboss (elemento <security-domain>).............................................10 CLASS-LOADER DE APLICACIONES..............................................................................................................................10 CONTEXT ROOT................................................................................................................................................11 GENERACIÓN DE LOGS DE APLICACIÓN......................................................................................................................11 PROPIEDADES DE CONFIGURACIÓN...........................................................................................................................12 RENDIMIENTO DEL ACCESO A ELEMENTOS ESTÁTICOS......................................................................................................12 UTILIZACIÓN DE MAVEN...................................................................................................................................12 CONSIDERACIONES ADICIONALES ...........................................................................................................................12 APLICACIÓN DE LOS PARCHES CAIB ............................................................................................................13 APLICACIÓN DEL SCRIPT DE SEGURIDAD.....................................................................................................................13 PARCHES SUMINISTRADOS POR RED HAT...................................................................................................................13 OPTIMIZACIONES..............................................................................................................................................13 http://dgtic.caib.es > 2 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Introducción Este documento detalla el estándar de desarrollo de aplicaciones JEE que se debe seguir para el desarrollo de aplicaciones que se instalarán en los servidores de la DGIDT. El documento trata varios aspectos: • Definición del entorno operativo • Nomenclatura de aplicaciones • Arquitectura de aplicaciones • Adaptación del JBoss al entorno CAIB http://dgtic.caib.es > 3 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Estándar de desarrollo de aplicaciones JEE A continuación se detallan un conjunto de normas de carácter general relacionadas con el desarrollo y ejecución de aplicaciones JEE. 1. Las aplicaciones web que se desarrollen para el Govern de les Illes Balears deberán estar preparadas para ser ejecutadas sobre el servidor de aplicaciones Jboss 5.1.2 EAP una vez aplicados los parches de la CAIB (descargables desde dgtic.caib.es). 2. Además serán desarrolladas siguiendo los estándares publicados por la Direcció General d'Innovació i Desenvolupament Tecnològic. 3. Las aplicaciones se deberán desarrollar utilizando la arquitectura MVC (interfaz, lógica y datos). 4. El software de base a utilizar será el que se detalla a continuación: Interface de usuario Producto Tecnología Servlets 2.5 JSF 1.2 / JSP 2.1 Firefox 13.0 o superior IE 7.0 o superior Lógica de aplicación Producto Tecnología Jboss 5.1.2 (parche CAIB 1.4) JVM: jdk-1.6.0_23 EJB 3.0 Persistencia Tecnología JPA 1.0 Base de datos Producto Oracle 11 PostgreSQL 8.4 Tecnología JDBC ANSI-SQL 5. Las integraciones se llevarán a cabo mediante la utilización de Web Services, según la especificación estándar JAX-WS de JEE 1.5 y usando las librerías CXF (ver apartado Aplicación de Parches CAIB – Parches suministrados por RedHat). 6. En función de criterios de mantenimiento y disponibilidad de versiones y con el objetivo de mejorar el servicio ofrecido a las consellerias, el Centro de Proceso de Datos de la DGIDT se reserva la facultad de actualizar las versiones del software aquí reflejadas por otras superiores en el momento de la puesta en producción. http://dgtic.caib.es > 4 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE 7. El producto final y las actualizaciones se entregarán según el formulario estándar de cuaderno de carga definido por la DGIDT (ver Documento de Implantación de aplicaciones, Capítulo 4. Cuaderno de carga). 8. El sistema deberá cumplir las medidas de seguridad designadas en el R.D. 1720/2007, de 21 de Diciembre, por el que se aprueba el Reglamento de desarrollo de la Ley Orgánica 15/1999, de 13 de Diciembre, de Protección de Datos de Carácter Personal (LOPD). 9. El SGBD a utilizar vendrá determinado por la DGIDT. Se informará de la elección realizada como respuesta a la solicitud de inicio de proyecto. Nomenclatura de aplicaciones JEE Nomenclatura de clases Jerarquía de paquetes Las clases de objetos se estructurarán en aplicaciones y paquetes. Todas las aplicaciones y paquetes dependerán jerárquicamente del dominio de paquetes es.caib. Así las clases se denominarán es.caib.Aplicación.Paquete.Clase, tal y como puede observarse a continuación: Los caracteres válidos serán aquellos definidos por el estándar Java: letras mayúsculas y minúsculas del alfabeto inglés y números en posición no inicial. Los nombres de aplicación estarán siempre en minúsculas y deberán ser solicitados y autorizados por el Centre de Procés de Dades de la DGIDT (ver documento de Implantación de aplicaciones, Capítulo 2. Solicitud de código de aplicación). http://dgtic.caib.es > 5 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Los nombres de paquete estarán siempre en minúsculas y podrán ser nombrados, dentro del paquete de aplicación, a criterio de analistas y diseñadores. Nomenclatura de clases Las clases se nombrarán con la primera letra mayúscula y el resto en minúsculas. Las clases formadas por varias palabras utilizarán mayúsculas para la inicial de cada una de ellas: es.caib.aplicacion.paquete.Clase es.caib.aplicacion.paquete.ClaseDeVariosVocablos Nomenclatura de métodos Los métodos se nombrarán con todas las letras minúsculas, incluida la inicial. Las clases formadas por varias palabras utilizarán mayúsculas para la inicial de las segundas palabras: es.caib.aplicacion.paquete.Clase.metodo es.caib.aplicacion.paquete.Clase.metodoDeVariosVocablos Nombres de aplicación Para evitar problemas de coincidencias de nombres a la hora de desplegar las aplicaciones en el servidor JEE, los nombres de aplicación (fichero *.ear) y de aplicación web (fichero *.war) deberán definirse de la siguiente forma: • El nombre del fichero *.ear deberá coincidir con el nombre (código) de aplicación proporcionado por la DGIDT. Por ejemplo: ◦ Si el nombre de aplicación es NOMBREAPLICACIÓN, el nombre del fichero *.ear deberá ser nombreaplicación.ear • Para la nomenclatura de los ficheros *.war se considerarán dos posibilidades: ◦ Si la aplicación tiene un único fichero *.war, éste deberá tener el mismo nombre que el fichero *.ear ◦ Si la aplicación tiene varios ficheros *.war, los nombres de estos deberán estar precedidos por los tres caracteres de prefijo de aplicación seguidos de _. Ejemplo: Si el prefijo de la aplicación NOMBREAPLICACIÓN es APL, los nombres de ficheros *.war deberán ser apl_xxxxxx, donde xxxxxx será un nombre lo más simple y representativo posible. En el caso de existir Front-Office y Back-Office, el nombre recomendado para el Front-Office será APL_front.war, mientras que en el caso del Back-Office será APL_back.war. El código de aplicación y su prefijo habrán sido facilitados previamente por el Centro de Proceso de Datos de la DGIDT (ver Documento de Implantación de Aplicaciones, Capítulo 2. Solicitud de código de aplicación). http://dgtic.caib.es > 6 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Nombres de los JAR Para la nomenclatura de los ficheros *.jar se considerarán dos posibilidades: • Si la aplicación tiene un único fichero *.jar, éste deberá tener el mismo nombre que el fichero *.ear • Si la aplicación tiene varios ficheros *.jar, los nombres de estos deberán ser: es_caib_nombreaplicación_nombrejar.jar, donde nombreaplicación deberá coincidir con el código (nombre) de aplicación facilitado por el Centro de Proceso de Datos de la DGIDT (ver Documento de Implantación de Aplicaciones, Capítulo 2. Solicitud de código de aplicación). Ejemplos: Dada una aplicación con código (nombre) NOMBREAPLICACIÓN, prefijo APL y varios ficheros *.jar, los nombres de ficheros *.jar deberán ser es_caib_nombreaplicación_xxxxxx, donde xxxxxx será un nombre lo más simple y representativo posible. Dada una aplicación con código NOMBREAPLICACIÓN, prefijo APL y un único fichero *.jar, el nombre del fichero deberá ser nombreaplicación.jar. Arquitectura de aplicaciones Servicios de directorio del servidor de aplicaciones El acceso al servicio de directorio (NamingFactory) se realizará siempre con los parámetros por defecto, asumiendo que las propiedades JNDI están correctamente configuradas. Los servicios de directorio del servidor transaccional identificarán cada Enterprise Java Bean mediante su nombre jerárquico completo, debiendo acceder las clases Java a él mediante dicho nombre. El acceso a otro tipo de servicios, tales como conexiones a base de datos o pools de conexiones se realizará a través de nombres jerárquicos dependientes de la jerarquía de la aplicación. Ejemplo: Base de datos: es.caib.aplicación.db.XXXXXX Mail: es.caib.aplicacion.mail.XXXXX Acceso a bases de datos El acceso se realizará a través de la jerarquía es.caib.codigoaplicacion.db, donde codigoaplicacion indica el código asignado por la DGIDT a la aplicación. Dentro de esta jerarquía se encontrará un objeto para cada conexión a base de datos definida en la aplicación. La base de datos seguirá los criterios de nomenclatura de las clases de objeto: es.caib.aplicacion.db.Presidencia es.caib.aplicacion.db.Defecto http://dgtic.caib.es > 7 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE es.caib.aplicacion.db.RecursosHumanos El usuario del pool de conexiones deberá seguir la nomenclatura WWW_xxxxxx, donde xxxxxx tiene que coincidir con el código de aplicación. El acceso a la base de datos debe hacerse utilizando cliente thin, no OCI. Módulos JSP/JSF, Servlets y Enterprise Java Beans Todas las peticiones se procesarán a través de Servlets o de Managed Beans, preferiblemente Managed Beans. Estos recogerán las peticiones del usuario y localizarán el Enterprise Java Bean adecuado a través del método lookup o inyección del servicio. Es muy importante remarcar que bajo ninguna circunstancia ni el servlet, ni los managed beans, ni las páginas JSP/JSF o en general cualquier módulo de la capa de presentación deberá acceder de forma directa a los pools de conexión a la base de datos. Toda operación contra bases de datos deberá ser canalizada a través de los EJBs. Dicho EJB realizará las operaciones necesarias a través de los pools de conexión a la base de datos y devolverá información al servlet. El servlet o managed bean analizará la respuesta y la redirigirá a la página JSP/JSF correspondiente, la cual realizará las funciones de representación de las páginas adecuadas. En condiciones excepcionales, cuando la lógica del proceso a generar sea prácticamente nula y no se tenga que mostrar una página u otra en función de los datos introducidos, se permitirá que el usuario envíe la petición http directamente a una página JSP/JSF, previa consulta y autorización. http://dgtic.caib.es > 8 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Seguridad de aplicaciones Todos los aspectos relativos a identificación y autorización de los usuarios a servlets, JSPs, JSFs o EJBs serán gestionados de forma externa a las aplicaciones, desde el entorno de administración de la plataforma JEE, por lo que no se debe codificar dentro de servlets, JSPs, JSFs ni EJBs ninguna regla o criterio de autenticación. Sí pueden estar codificados dentro de la aplicación aspectos relativos a cómo se presenta el interface de usuario. En caso de que la aplicación JEE requiera restringir el acceso a los recursos mediante un usuario y password deberán configurarse los siguientes elementos: <security-constraint> <login-config> <security-role> Elemento <login-config> El método utilizado para autentificar el usuario deberá ser preferentemente FORM y el nombre de realm especificando Govern de les Illes Balears. No deberá utilizarse el tag <form_login_config>. Ejemplo: <login-config> <auth-method>FORM</auth-method> <realm-name>Govern de les Illes Balears</realm-name> </login-config> Elemento <security-role> En el fichero web.xml (y ejb-jar.xml) se deberán definir uno o varios roles para la aplicación, con sus respectivas descripciones. Ejemplo: <security-role> <description>… descripción …</description> <role-name>APL_ XXXXXX</role-name> </security-role> Para poder integrar la seguridad definida a nivel de aplicación con el sistema de seguridad de la CAIB será necesario que los nombres de roles definidos en el fichero web.xml estén estandarizados según las normas de la DGIDT. Para el caso de una aplicación con prefijo APL_ el nombre especificado con el tag <rolename> debe ser APL_XXXXXX, donde XXXXXX debe ser un nombre lo más simple y representativo posible. Ejemplos de nombres de roles: APL_CONSULTA APL_INTRODUCCIO APL_ADMINISTRACIO Por otro lado, hay que tener en cuenta que en el cuaderno de carga donde se definan los roles, se tiene que adjuntar una descripción completa de cada uno de ellos. http://dgtic.caib.es > 9 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Elemento <security-constraint> Se deberá utilizar en caso de tener que definir privilegios de acceso para una colección de recursos. Deberán especificarse los roles que tendrán acceso a los recursos protegidos. Protección de EJBs Es necesario proteger los EJBs de manera que ningún usuario anónimo pueda ejecutarlos, salvo que los EJBs deban ser públicos. Para protegerlos hay que poner security constraints a los EJBs con el tag method-permission el fichero ejb-jar.xml. Ejemplo: <security-role> <role-name>nombre_de_rol</role-name> </security-role> <method-permission> <role-name>nombre_de_rol </role-name> <method> <ejb-name>nombre_de_EJB</ejb-name> <method-name>método</method-name> <method-params> <method-param>parámetro1</method-param> <method-param>parámetro2</method-param> </method-params> </method> </method-permission> Existe la posibilidad de utilizar las anotaciones de EJB3 para proteger los EJBs. Declaración de dominios de seguridad en Jboss (elemento <security-domain>) El acceso a los recursos protegidos deberá hacerse dentro del siguiente dominio de seguridad (Security Domain), que se deberá especificar tanto en el jboss-web.xml como en el jboss.xml. <security-domain> java:/jaas/seycon </security-domain> Class-Loader de aplicaciones Cada aplicación deberá convivir en el mismo servidor JBoss con otras de distintos proveedores. Por tal motivo cada aplicación deberá aislarse mediante un ‘class-loader’ propio para evitar conflictos de librerías (lucene, struts, hibernate, etc.). Se pueden usar alguno de los dos métodos que proporciona JBoss: 1. Usando la etiqueta loader-repository del jboss-app.xml (y los respectivos ficheros de los war y ejb-jar). A continuación se muestra un ejemplo de jboss-app.xml, con la configuración de loader-repository (debe ser adaptado para las necesidades de cada aplicación): <jboss-app> <loader-repository> es.caib.aplicacion:loader=aplicacion.ear <loader-repository-config> java2ParentDelegation=false http://dgtic.caib.es > 10 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE </loader-repository-config> </loader-repository> </jboss-app> 2. Usando el descriptor jboss-classloading.xml (para war, ejb-jar y ear). A continuación se muestran ejemplos para el ear y el war respectivamente (deben ser adaptados para las necesidades de cada aplicación). <classloading xmlns="urn:jboss:classloading:1.0" domain="aplicacion.ear" export-all="NON_EMPTY" import-all="true" parent-first="false"> </classloading> <classloading xmlns="urn:jboss:classloading:1.0" domain="aplicacion.war" parent-domain="aplicacion.ear" export-all="NON_EMPTY" import-all="true"> </classloading> Context root • En caso de tener un único context root, éste deberá coincidir con el código de la aplicación. • Si la aplicación tiene un frontoffice (público) y un backoffice (privado), el ear deberá contener dos war, y la nomenclatura del context root será: ◦ Nombre de la aplicación seguido de la palabra front ('nombreaplicación'front) para el context root del frontoffice. ◦ Nombre de la aplicación seguido de la palabra back ('nombreaplicación'back) para el context root del backoffice. • Si la aplicación tiene servicios web, el context root de publicación será 'nombreaplicación'front/ws, 'nombreaplicación'back/ws o en caso de solo tener backoffice 'nombreaplicación'/ws. • En ninún caso se dará acceso a otros contextos que no sean los especificados anteriormente. Generación de logs de aplicación En cuanto a la generación de logs de usará siempre la librería estándar de JBoss: log4j. Además, los mensajes de depuración generados por la aplicación deberán aparecer en la categoría DEBUG o TRACE, nunca INFO o WARN (usando siempre log4j). Por otro lado, en ningún caso se deberá mostrar información confidencial por log (por ejemplo datos protegides por la LOPD). Nota: queda prohibido el uso de System.out (los mensajes generados utilizando System.out no son guardados por el sistema de log configurado en los servidores). http://dgtic.caib.es > 11 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE Propiedades de configuración Las propiedades de configuración, o ficheros adicionales propios de cada aplicación se deberán definir en un fichero <código-aplicacion>-service.xml (mediante el mbean SystemPropertiesService, cuyo atributo name tenga como subatributo name el formato codigoaplicacionProperties). • Las propiedades tendrán como prefijo es.caib.<código-aplicacion>. • El fichero se desplegará directamente en el directorio deploycaib. Ejemplo: La aplicación necesita acceder a un almacén de claves, por lo que establece una propiedad que indicará la ruta del fichero que estará dentro del mismo fichero .sar. Ejemplo (aplicacion-service.xml): <server> <mbean code="org.jboss.varia.property.SystemPropertiesService" name="jboss:type=Service,name=AplicacionProperties"> <attribute name="Properties"> es.caib.aplicacion.propiedad1=valor1 es.caib.aplicacion.propiedad2=valor2 es.caib.aplicacion.propiedad3=valor3 </attribute> </mbean> </server> Rendimiento del acceso a elementos estáticos Para mejorar el uso de la cache, los elementos estáticos de la parte web que no requieran especial protección (imágenes usadas para el diseño de la web, por ejemplo) no deberán ser protegidos por rol dentro del fichero WEB-INF/web.xml de los paquetes WAR. Utilización de MAVEN Para las nuevas aplicaciones desarrolladas cumpliendo los estándares de desarrollo de la DGIDT será obligatoria la utilización de Maven para la construcción de los proyectos. Se deberán utilizar siempre repositorios públicos y en caso de que haya librerías que no estén disponibles en dichos repositorios, se deberá informar a la DGIDT por si estima oportuna su inclusión en el repositorio interno de la DGIDT (Archiva). Consideraciones adicionales Para todas aquellas funcionalidades no especificadas en este documento, se recomienda la utilización de estándares JEE, evitando en la medida de lo posible soluciones particulares que solo funcionen sobre JBoss. • Las aplicaciones deberán utilizar el juego de caracteres UTF-8: <?xml version=... encoding="UTF-8" ?> • Siempre que se requieran librería de terceros se utilizarán preferiblemente aquellas que estén disponibles en la distribución de Jboss modificada por la DGIDT (disponible en http://dgtic.caib.es/estandards/index.html). http://dgtic.caib.es > 12 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE • Los beans serán preferentemente stateless session beans. • Los stateful session beans deberán implementar adecuadamente los métodos activate y passivate al efecto de minimizar el consumo de memoria y recursos. Nota: se deberá comunicar a la DGIDT antes de utilizarlos. • Todo acceso a un recurso localizable vía JNDI debe estar referenciado de forma relativa a java:comp Aplicación de los parches CAIB Para asegurar que se desarrollan las aplicaciones para un entorno como el de la CAIB, es necesario aplicar diversas modificaciones a la versión de Jboss 5.1.2 EAP. Se trata del parche de seguridad (que configura los aspectos de acceso al módulo de autenticación de la CAIB, Seycon), de la librería CXF para soporte a Web Services, y por otro lado algunas optimizaciones propuestas para optimizar el rendimiento de JBoss, quitando los servicios que no van a ser usados. A continuación se indican los pasos a seguir para aplicarlos. Aplicación del script de Seguridad Para instalar las modificaciones de seguridad se tiene que usar el script jboss-patch-1.4.jar. Concretamente la sentencia a ejecutar es: java -jar jboss-patch-1.4.jar <directori> <configuració> <tipus> <directori> es el directorio raiz del jboss (el que contiene los directorios bin, client, server ...) <configuració> indicar default (la otra opción, jetty, se usa para configurar un servidor de autenticación) <tipus> Entorno para el cual va destinado el jboss: development, preproduction, production Exemple: java -jar jboss-patch-1.4.jar /app/jboss-eap-5.1.1/jboss-as default development Parches suministrados por Red Hat Para el uso de Web Services, será obligatorio el uso de la librería CXF suministrada por Red Hat (JBoss EAP 5.1.2 Web Services CXF ). Cualquier otro parche que pueda suministrar Red Hat que solvente fallos de rendimiento o de seguridad, podrán ser instalados en los servidores de aplicaciones alojados en el Govern. Optimizaciones Como ya se ha comentado, el script de Serveis Web elimina ciertos aspectos de la configuración, funcionalidades y módulos que no son usados por las aplicaciones del Govern, el objetivo es optimizar el rendimiento de Jboss 5.1.2. Concretamente: 1. Eliminar las políticas de autenticación que no se usen (se tiene que usar la de seycon) de conf/login-config.xml 2. Eliminar el servicio BSH (deployers/bsh.deployers) http://dgtic.caib.es > 13 Estándar de desarrollo de aplicaciones > Estándares de Sistemas JEE 3. Eliminar el servicio de mensajería 4. Eliminar el servicio de Scheduling Quartz (deploy/quartz-ra.rar) 5. Eliminar el servicio uuid-key-generator (deploy/uuid-key-generator.sar) 6. Eliminar el servicio XNIO (deploy/xnio-provider.jar i deployers/xnio.deployer) 7. Eliminar la Base de dades Hypersonic (i las referencias en los servicios que la usen) 8. Configurar el jboss para que borre el directorio temp automáticamente cuando se reinicie el servidor http://dgtic.caib.es > 14