Uso librería de integración java: Autenticación y filtro J2EE

RECU-0512 (Recurso Ejemplo)

Descripción

Se muestra un ejemplo para la autenticación de usuarios utilizando el filtro J2EE de las librerías de integración.

Requisitos

  • Java 1.6
  • Maven 2.2.1
  • Apache Tomcat
  • Conectividad con el Repositorio de Librerías de la Junta de Andalucía
  • La JVM confía en certificados de servidor del OVD:
    • Certificado de la autoridad certificadora, CA, del certificado utilizado por OVD.
    • El propio certificado de servidor.

Ejemplo

La aplicación de ejemplo contendrá los siguientes elementos:

  • un fichero index.jsp que mostrará un contador almacenado en la variable de sesión “cuenta”.
  • un fichero login.jsp que se mostrará cuando el usuario entre en la aplicación por primera vez.
  • una clase com.miapp.AppAuthenticator que implementará la interfaz  es.juntadeandalucia.guia.mag4j.app.ApplicationAuthenticator

Creación del proyecto utilizando maven

Ejecutamos el siguiente comando maven que creará el proyecto correspondiente:

$> mvn archetype:create -DgroupId=com.miapp -DartifactId=mi-webapp-test -DarchetypeArtifactId=maven-archetype-webapp

Referencia a las librerías (pom.xml)

Dentro de la carpeta mi-webapp-test, creada en el paso anterior, encontramos el fichero pom.xml. Modificamos dicho fichero para incluir la librería de integración mag4j-impl-auth que nos da acceso a la autenticación. Aquí vemos el contenido final de dicho fichero.

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com-miapp</groupId>    
    <artifactId>mi-webapp-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>mi-webapp-test Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>es.juntadeandalucia.guia</groupId>
            <artifactId>mag4j</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>
</project

Fichero de propiedades

Creamos el fichero $/mi-webapp-test/src/main/resources/mag4j.properties

En dicho fichero se definen: los parámetros de conexión al directorio, la cuenta de servicio, la contraseña para realizar dicha conexión y los datos de configuración del flitro. Se muestra un ejemplo del mismo en el que habrá que establecer los valores oportunos.

initialContextFactory = com.sun.jndi.ldap.LdapCtxFactory
#host = ldap://172.18.24.29:389
host = ldaps://directoriovirtual.ves.i-administracion.junta-andalucia.es:636
authMode = simple
baseDN = o=personas,o=identidades,o=comun,dc=juntadeandalucia,dc=es
#cuenta de servicio para conectarse al OVD
oidUserDN = cn=cs_ejemplo,o=servicios,o=identidades,o=comun,dc=juntadeandalucia,dc=es
oidPassword = passwordejemplo
#donde y como buscar el usuario
userSearchFilter=(&(objectclass=inetorgperson)(cn={0}))

truststore_location=/tmp/almacen
truststore_password=myStorePassword


#para el ApplicationAuthenticator
applicationAuthenticatorClass=com.miapp.AppAuthenticatorImpl
loggedUserAttribute = app_user
loginResourcePath = /login.jsp
requestUserParameter = usuario
requestPasswordParameter = password

 

Las propiedades truststore_* deberán ser definidas en caso de que el certificado de servidor o su CA no hayan sido instaladas en keystore definido por defecto en la JVM.

Fichero de log (opcional)

Creamos el fichero $/mytest/src/test/resources/log4j.properties

Se muestra un fichero de configuración de log de ejemplo muy simple.

log4j.rootLogger=DEBUG, stdout, A1

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c %x - %m%n

log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p %c %x - %m%n
log4j.appender.A1.File=out.log
log4j.appender.A1.MaxFileSize=512KB
log4j.appender.A1.Append=false

Configuración de web.xml

El fichero web.xml de la aplicación deberá contener el siguiente fragmento:

  <filter>
<filter-name>MaG4JFilter</filter-name>
<filter-class>es.juntadeandalucia.guia.mag4j.auth.filters.MaG4JAuthenticationFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>MaG4JFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Fichero index.jsp

El fichero index.jsp actualizará el contador de la sesión y lo enviará al navegador.

<% 
Integer cuenta = (Integer)session.getAttribute("cuenta");
session.setAttribute("cuenta", new Integer(++cuenta));
%>
<html>
<body>
<h2>Cuenta: <%=cuenta%></h2>
<a href="/servicios/madeja/">Actualizar</a>
</body>
</html>

Fichero login.jsp

Este fichero se encargará de mostrar al usuario el formulario para entrar en la aplicación:

<%String app = request.getContextPath(); %>
<%String referer = request.getHeader("REFERER");
if(referer==null) referer="";
%>
<html>
<body style="padding: 50px">

<form action="<%=referer%>" method="post">
<div>Usuario: <input type="text" name="usuario" onfocus="select()"/></div>
<div>Password: <input type="text" name="password" onfocus="select()"/></div>

<div><input type="submit" name="submit" value="Enviar" /></div>
</form>

</body>
</html>

Clase java

Por último añadimos la clase AppAuthenticatorImpl que implementa de la interfaz es.juntadeandalucia.guia.mag4j.app.ApplicationAuthenticator. Esta clase estará ubicada en la carpeta del proyecto src/main/java/com/miapp.

package com.miapp;

import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import es.juntadeandalucia.guia.mag4j.spec.MaG4JException;
import es.juntadeandalucia.guia.mag4j.spec.UserData;
import es.juntadeandalucia.guia.mag4j.spec.app.ApplicationAuthenticator;

public class AppAuthenticatorImpl implements ApplicationAuthenticator {
private String requestUserParameter;
private String requestPasswordParameter;
private String loggedUserAttribute;

public void init(Properties properties) throws MaG4JException {
this.requestUserParameter = properties.getProperty("requestUserParameter");
this.requestPasswordParameter = properties.getProperty("requestPasswordParameter");
this.loggedUserAttribute = properties.getProperty("loggedUserAttribute");
}

public String getUserId(HttpServletRequest request) throws MaG4JException {
return request.getParameter(this.requestUserParameter);
}

public String getUserPassword(HttpServletRequest request) throws MaG4JException {
return request.getParameter(this.requestPasswordParameter);
}

public boolean identifiedUser(HttpServletRequest request) throws MaG4JException {
return null != (request.getSession(true).getAttribute(this.loggedUserAttribute));
}

public void userAuthenticatedByFilter(HttpServletRequest request, UserData data) throws MaG4JException {
HttpSession session = request.getSession(true);
session.setAttribute(this.loggedUserAttribute, data);
session.setAttribute("cuenta", new Integer(0));
}

public void setConfigurationProperties(Properties arg0) throws MaG4JException {
// nada
}

public void updateUser(HttpServletRequest request, UserData userData) throws MaG4JException {
// nada
}

public void redirectToLogin(HttpServletRequest arg0, HttpServletResponse arg1) throws MaG4JException {
// nada
}
}

La clase simplemente lee el fichero de propiedades, inicializa la conexión y autentica un usuario cuyo cn y contraseña se establecen en el propio código fuente.

Ejecución del ejemplo

Para probar el ejemplo podemos ejecutar el siguiente comando maven:

$> mvn package 

que nos genera el fichero desplegable de la aplicación en target/mi-webapp-test.war. Para probar la aplicación habrá que desplegar este war en un contenedor j2ee como tomcat:

  • Copiamos el war y lo pegamos en la ruta $TOMCAT_HOME/webapps/
  • Arrancamos el servidor tomcat
  • Con un navegador accedemos a http://localhost:8080/mi-webapp-test/
  • Introducimos un usuario y contraseña correctos y accedemos a la aplicación.
  • Una vez que hemos accedido podemos actualizar la página una y otra vez y vemos como la cuenta de accesos se incrementa (este valor está almacenado en el ámbito de sesión).