Uso librería de integración java: Autenticación y filtro J2EE
- Área: GUIA: Gestión Unificada de Identidades de Andalucía
- Carácter del recurso: Recomendado
- Fases del ciclo de vida: Construcción del Sistema de Información (CSI)
- Perfiles: Programador
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
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).
Contenidos relacionados
Código | Título | Tipo | Carácter |
---|---|---|---|
RECU-0433 | Obtención e instalación de certificados en clientes J2EE | Referencia | Recomendado |