Filtros con J2EE

VictorR Lunes, 24 de Octubre del 2005

Etiquetas:

¿Alguna vez te has preguntado cómo consiguen las páginas enviarte directamente a la página de login al entrar en una zona restringida?

Pues es lo que he aprendido hoy, por lo menos una manera, con Servlets de Java, más bien con los Filtros que Java te permite crear para controlar el acceso a una parte del contexto de la web.

El código y la idea son muy sencillos. Simplemente debemos añadir, en el momento del login, un atributo a la sesión que crea Java y controlar que exista mediante el Filtro antes de acceder la zona restringida. Si existe y el usuario tiene permiso para acceder adelante. Si no existe el Filtro se encargará de redireccionar al usuario a la página de login.

El código te lo explico en un momento.

Para empezar, lo primero es definir un poco qué es un Filtro en Java o cúales son sus características básicas. Para crear un Filtro debemos crear una clase que implemente la interfaz Filter (javax.servlet.Filter):

public class LoginFilter implements Filter {

Esta clase, por lo tanto, deberá implementar las tres funciones de la interfaz, init, doFilter y destroy. Me centraré en la función doFilter que es dónde el filtro realiza las funciones necesarias para filtrar las peticiones que le lleguen.

Es aquí dónde debemos controlar que el atributo de la sesión creado en login exista para dar carta blanca al usuario que quiera acceder a la zona restringida, o devolverlo al login.

doFilter recibe tres parámetros, ServletRequest, ServletResponse y FilterChain, este último es el siguiente filtro o servlet en la cadena de responsabilidades dentro de la zona que cubra nuestro filtro. Veamos el código:

public void doFilter (ServletRequest req, ServletResponse res, FilterChain chain){
    HttpSession session;
    if (req instanceof HttpServletRequest){
        session = ((HttpServletRequest)req).getSession();
        if (session.getAttribute("Usuario") != null) {
            chain.doFilter(req, res);
        } else {
            ((HttpServletResponse)res).sendRedirect(((HttpServletRequest)req).getContextPath() + "Login");
        }
    }
}

En negria está la clave del Filtro, por lo menos de este filtro, si el atributo que debería haber creado el login existe, permite seguir la cadena de responsabilidades y llegar al destino que desea el usario, si no realizando un sendRedirect(“path”) volvemos al login.

Sin embargo, para que este filtro funcione, debemos configurar primero nuestro web.xml que tendremos en la aplicación añadiendo las siguientes lineas:

<filter>
    <filter>LoginFilter</filter>
    <filter>LoginFilter</filter>
</filter>
<filter>
        <filter>
              <filter>LoginFilter</filter>
              <url>/*</url>
       </filter>
</filter>

En este caso, hemos registrado el filtro llamándolo como la clase que hemos creado, LoginFilter, y hemos indicado su rango de acción mediante el tag <url></url>. En este caso todas la peticiones que reciba el contenedor de nuestra web pasará por el filtro.

Por ejemplo, si en lugar de crear una web totalmente restringida quisiéramos tener solo una zona, por ejemplo la zona user, deberíamos poner:

<url>/user/*</url>

Y eso es todo!! no es nada dificil crear una zona restringida.

9 comentarios a "Filtros con J2EE" »
Comentario de Al — Viernes, 28 de Abril del 2006 @ 13:10

Jejejeje. Si, los filtros están muy bien para eso y para muchas otras cosas :-D . Por ejemplo para cachear páginas dínamicas comunes a un usuario y/o rol.

Pero bueno, lo que quería decir, por completar tu post, es que en ocasiones tienes que “proteger” la aplicación entera (/*), en cuyo caso tienes que tener claro que no puedes “proteger” ni las imágenes, ni los estilos, ni la propia página de login (y en su caso la acción que lo procesa). Lo digo porque si te quieres hacer un filtro hipergenérico lo tendrás que tener en cuenta.

En cualquier caso, y aunque el aprender ensuciándose las manos siempre es bueno, deseable y recomendable:

1.- ya existen este tipo de soluciones, por si te interesa curiosear alternativas. Por ejemplo, ACEGI: http://www.acegisecurity.org/
2.- el propio contendor de servlets te puede ayudar a este tipo de cosas: http://www.javahispano.org/articles.article.action?id=24

Si te apetece le echas un vistazo a las referencias, quizás te ayuden en el futuro.

Comentario de VictorR — Miércoles, 3 de Mayo del 2006 @ 19:55

Hola Al,

Muchas gracias por el consejo, enseguida me pongo a ojear estos links, y si tengo un poco de tiempo intentaré hacer otro post un poco más completo sobre el tema.

Como ves, soy un novato en el J2EE y precisamente, este fue uno de los primeros que hice mientras estaba en periodo de formación en la empresa sobre la tecnología. A modo, de “plasmar” un poco las lecciones en el blog empecé por aquí, pero sin duda que han quedado muchisimos temas pendientes que algun día me gustaría tratar.

Un saludo y gracias de nuevo.

Comentario de Kennycop — Domingo, 21 de Enero del 2007 @ 17:59

Hola amigos, os planteo una dudilla, he creado un sitio web en un servidor de telefonica, por lo cual no puedo hacer nada con php ni nada parecido aunque me guataría crear una zona restringida como podría crearla, la pagian esta en html.

Gracias…

Comentario de VictorR — Miércoles, 24 de Enero del 2007 @ 14:05

hola Kennycop, no se me ocurre gran cosa ahora mismo, y no se si se podría hacer algo en JavaScript para validar usuarios… todo sería investigarlo, pero me da que “seguridad” y JS no me parecen sinonimos, sobretodo cuando puedes desactivarlo del navegador y navegar a tus anchas…

Comentario de PICCORO — Lunes, 5 de Noviembre del 2007 @ 21:12

tu exelente contribucion es pequeña para lo que querias o para validaciones de usuarios o paginas, pero muy grande para aplicaciones de seguridad, ya que con tu codigo se pueden pasar manualmente datos del objeto sesion, muy util en mi caso donde se manejan muchas cosas a mano y las aplicaciones y frameworks existentes no nos son utiles..

un gran aporte sin duda..

a kennycop te digho solo debes poner un index.html con un refrest redirec en el meta, y listo, cuando entren al los “x” segundos se redirigira a donde señales, como ejempo entra en http://www.indigodss.com/venenux y veras como te redirige

Comentario de nerelaya — Sábado, 21 de Marzo del 2009 @ 16:00

Hola!

Soy nueva con esto de los filtros. He leido como realizar un filtro y no consigo entender como seria todo el codigo de LoginFilter para poder con los dos metodos que se necesitas y como se conseguiria ir a un jsp de login y que despues de loguearse y crear la sesion se vuelva a estar en la misma pagina en la que se estaba.

Podria alguien ayudarme!

muchas gracias.

Comentario de JuditNiLe — Sábado, 28 de Marzo del 2009 @ 10:15

Hola!!

Felicidades por la web y por los diferentes aportes que he visto en los comentarios.
Actualmente tengo que realizar un proyecto en J2EE y no sabia muy bien como atacar el tema de las zonas restringidas, así que ya sé por donde comenzar.

Saludos!

Comentario de VictorR — Domingo, 29 de Marzo del 2009 @ 22:39

Hola Judit y nerelaya, gracias por los comentarios.

En cuanto a la seguridad de una aplicación web, os aconsejo enormemente utilizar acegi (ahora spring security) http://static.springsource.org/spring-security/site/index.html y bueno, así en general, pues usar frameworks que son un gran invento. Yo uso springframework 2.5 con struts 2 en el proyecto en el que me encuentro actualmente y me ha salvados muuuchas horas de trabajo.

Un saludo!

Comentario de Cusagi — Jueves, 2 de Julio del 2009 @ 17:17

Hola :

Tu aportación esta muy buena, pero queria pedir ayuda para que alguien me oriente como debo empezar un filtro que se una con axis2 para un web services

Muchas graciar por su apoyo

Saluditos

Suscripción RSS a los comentarios de esta entrada. TrackBack URL

Deja tu comentario

* Obligatorio. ** Obligatorio, no será publicado.