icono_twiter icono LinkedIn
Rubén Aguilera Díaz-Heredero

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática, especialidad en Ingeniería del Software

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2010-09-25

Tutorial visitado 4.720 veces Descargar en PDF
CAS: Validador personalizado

CAS: Validador personalizado

0. Índice de contenidos.

1. Introducción

Antes de seguir este tutorial os recomiendo que le echéis un vistazo al anterior de introducción a CAS, para entender de que se trata y poder instalar el producto. Introducción a CAS.

También os puede interesar personalizar la interfaz de CAS, podéis encontrar cómo en este tutorial CAS: Personalización de la interfaz

En este vamos a abordar como cambiar el validador que viene por defecto con CAS, que consiste en comparar usuario y contraseña y si son iguales darlo por bueno, por uno un poco más elaborado que acceda a una base de datos para ver si el usuario con esa contraseña existe.

2. Entorno

Este tutorial está escrito usando el siguiente entorno:
  • Hardware: Portátil Mac Book Pro 17" (2,6 Ghz Intel Core i7, 8 GB DDR3)
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.4
  • CAS Server 3.4.2.1

3. Creación del validador

Para crear el validador tenemos que crear un proyecto y que mejor forma de hacerlo que con Maven. Para ello vamos a abrir un terminal y ejecutar:
mvn archetype:create -DgroupId=com.autentia.casdemo -DartifactId=casdemo
Ahora editamos el fichero pom.xml del proyecto para añadir las siguientes dependencias:

	4.0.0

	com.autentia.democas
	democas
	1.0-SNAPSHOT
	jar

	democas
	http://maven.apache.org

	
		UTF-8
	

	
		
			junit
			junit
			3.8.1
			test
		
		
			org.jasig.cas
			cas-server-core
			3.4.2.1
		
	

Lo siguiente que tenemos que hacer es crear una nueva clase que herede de la clase AbstractUsernamePasswordAuthenticationHandler lo que nos obliga a implementar el método authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials) donde recibimos el usuario y la contraseña del usuario que se quiere logar. Un ejemplo de implementación podría ser este:
public class DemoCasValidador extends AbstractUsernamePasswordAuthenticationHandler{
	
	public boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
	  {
	    String username = credentials.getUsername();
	    String password = credentials.getPassword();
	    boolean valid = false;
	    
	    Connection con = null;
	    Statement sta = null;
	    ResultSet rs = null;
	    
	    
	    try {
	    	//Establecemos la conexión con el datasource
	        Context initCtx = new InitialContext();
	        Context envCtx = (Context) initCtx.lookup("java:comp/env");
	        DataSource dataSource = (DataSource) envCtx.lookup("jdbc/democas");
	        con = dataSource.getConnection();
	        con.setAutoCommit(false);
	        
	        //Instanciamos la sentencia
	        sta = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
	        
	        //Ejecutamos la query de validación
	        StringBuilder sql = new StringBuilder("SELECT USERNAME FROM USERS WHERE USERNAME = '").append(username).append("' AND PASSWORD ='").append(password).append("'");
	        rs = sta.executeQuery(sql.toString());
			
	        //Si el ResultSet tiene datos quiere decir que el usuario es válido
			valid = rs.next();
			
			
		} catch (ConfigurationException e) {
			e.printStackTrace();
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				//Cerrramos la conexión
				rs.close();
				sta.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	    
		return valid;
	  }

}

4. Configuración de CAS

Una vez implementado el validador tenemos que configurar CAS para que lo utilice en vez del que utiliza por defecto. Para ello vamos a empaquetar nuestro proyecto ejecutando en un terminal "mvn clean package", el .war resultante lo copiamos dentro de la carpeta %CAS_WEBAPP_HOME%/WEB-INF/lib para que la clase pueda ser accedida por CAS.

Por último, tenemos que editar el fichero %CAS_WEBAPP_HOME%/WEB-INF/deployerConfigContext.xml, buscamos la sección "authenticationHandlers" y sustituimos la clase que trae por defecto ("org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler") por la nuestra (com.autentia.democas.DemoCasValidador):

	
		 -->
					
		
					
	

Para configurar el datasource del que hace uso nuestra clase vamos a editar el fichero %TOMCAT_HOME%/conf/context.xml para añadir la declaración del datasource de esta forma:

Ya sólo nos queda reiniciar el servidor y comprobar que ahora para validarse en CAS tienes que estar registrado en la base de datos.

5. Conclusiones

Como era de esperar no es díficil modificar el validador que CAS trae por defecto por el que se ajuste a nuestras necesidades. En este tutorial hemos visto como logarse contra una base de datos pero esto es extensible para cualquier fuentes de datos como LDAP o Active Directory.

Saludos.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-11-18-11:38:30

Autor: rubenagui

Buenas, Has hecho bien este paso??? "Para ello vamos a empaquetar nuestro proyecto ejecutando en un terminal "mvn clean package", el .war resultante lo copiamos dentro de la carpeta %CAS_WEBAPP_HOME%/WEB-INF/lib para que la clase pueda ser accedida por CAS."

Saludos

Fecha publicación: 2013-11-18-11:04:52

Autor: veiguesa

Buenas, Hice los pasos que comentas metiendo la clase creada en el package com.autentia.casdemo el Tomcar no encuentra esta clase que creé me salta un error de tipo :
[com.autentia.casdemo.DemoCasValidador] for bean with name 'com.autentia.casdemo.DemoCasValidador#31704297' defined in ServletContext resource [/WEB-INF/deployerConfigContext.xml]; nested exception is java.lang.ClassNotFoundException: com.autentia.casdemo.DemoCasValidador, podrías decirme cual puede ser el problema???