domingo, 28 de noviembre de 2010

Seguridad en nuestra aplicación con Servlet Filter

En mi anterior entrada os comentaba que para ver un ejemplo de cookies, habíamos hecho una pequeña aplicación en la que teníamos una pagina de login que al autenticarse, creábamos una cookie para indicar que estábamos autorizados para navegar por la aplicación.
01             Cookie miCookie = new Cookie( "logged", "true" );
02             miCookie.setMaxAge( 60*60*24 );
03             response.addCookie( miCookie );
Con este código, creamos la cookie para saber que estamos autenticados. Entonces para poder proteger todas las páginas de la aplicación o todas las peticiones que hagamos al servidor, tendremos que comprobar que la cookie que nos indica que estamos autorizados esta creada y con el valor correcto,y en el caso de que no estemos autorizados dirigirlo a la pantalla de login.
01     Cookie[] cookies = request.getCookies();
02     boolean logged = false;
03     
04     if( cookies != null ) {
05         for( int i=0; i < cookies.length; i++ ) {
06             Cookie cookieActual = cookies[i];
07             String identificador = cookieActual.getName();
08             String valor = cookieActual.getValue();
09 
10             if( identificador.equals( "logged" ) && valor.equals( "true" ) ) {
11                 logged = true;
12             }
13         }
14     } 
15     if( !logged ) {
16         request.getRequestDispatcher( "/login.jsp" ).forward( request, response );
17     }
Con este código hacemos la comprobación de que el usuario esta autorizado, el problema es que tendremos que repetir en cada página o petición a un servlet la comprobación de las cookies.
Existe otra manera de centralizar la comprobación de las cookies para ver si el usuario ha pasado por el proceso de autorización, y no tener que preocuparnos cada vez que creemos una página nueva. En las aplicaciones de servidor con Java EE, existe un componente que son unos filtros. Estos filtros se activan antes de ejecutar en el servidor un servlet o un path concreto dentro de nuestra aplicación web. Para configurar un filtro lo que haremos sera crear una clase que implemente el interface javax.servlet.Filter y mediante anotaciones indicar su  nombre y una ruta a filtrar.
01 @WebFilter(filterName="Security", urlPatterns={"/*"})
02 public class Security implements Filter
En el ejemplo que he puesto se crea una clase que implementa el interface javax.servlet.Filter, le llamamos Security y hacemos que se active para cualquier llamada a algún recurso de nuestra aplicación mediante '/*', cualquier ruta ha partir del raiz de nuestra aplicación web.
Cuando se activa nuestro filtro, se llama a la función definida en el interface 'doFilter(ServletRequest request, ServletResponse response, FilterChain chain)'.  Los parámetros de este método son los mismos que recibiríamos en un servlet( request y response ) y ademas el objeto FilterChain, que lo utilizaremos para que  la petición al servidor siga su camino y se ejecute normalmente. Pueden existir definidos más de un filtro, los cuales se irán ejecutando uno detrás de otro hasta terminar con la ejecución de la petición al servidor.
01 @WebFilter(filterName="Security", urlPatterns={"/*"})
02 public class Security implements Filter
03 {
04     private FilterConfig filterConfig = null;
05 
06     public Security() {
07     }
08 
09     @Override
10     public void doFilter( ServletRequest request, ServletResponse response,
11                          FilterChain chain ) throws IOException, ServletException
12     {
13       Cookie[] cookies = ((HttpServletRequest)request).getCookies();
14       boolean logged = false;
15 
16       if( cookies != null ) {
17           for( int i=0; i < cookies.length; i++ ) {
18               Cookie cookieActual = cookies[i];
19               String identificador = cookieActual.getName();
20               String valor = cookieActual.getValue();
21 
22               if( identificador.equals( "logged" ) && valor.equals( "true" ) ) {
23                   logged = true;
24               }
25           }
26       }
27       if( !logged ) {
28           request.getRequestDispatcher( "/login.jsp" ).forward( request, response );
29       } else {
30         chain.doFilter(request,response);
31       }
32     }
33 
34     @Override
35     public void destroy() { 
36     }
37 
38     @Override
39     public void init(FilterConfig filterConfig) { 
40       this.filterConfig = filterConfig;
41     }
42 }
Como se puede ver en el código, el cuerpo del método doFilter es el mismo que poníamos al principio de esta entrada pero añadiéndole la linea chain.doFilter(request,response);. Con esta linea, si la autentificación ha ido bien, indicamos que continué con el siguiente filtro o realice la petición que se ha hecho al servidor. De esta manera solo hemos creado el código de verificación de usuario en el filtro, cada vez que llamemos a algún recurso de nuestra aplicación se ejecutara el filtro y comprobaremos si el usuario esta autorizado. Ya no necesitamos preocuparnos de repetir el código en todas las páginas o servlets que creemos nuevos.
Otra cosa que podríamos hacer, sería hacer que el filtro solo actuara en parte de nuestra aplicación web, de esta manera tendríamos parte visible a cualquiera y otra parte solo disponible a usuarios autorizados.
Por ejemplo se pueden definir los servlets privados de la siguiente manera
01 @WebServlet(name="Login", urlPatterns={"/private/users"})
02 public class Login extends HttpServlet
Aquí definimos un servlet dentro de 'private', entonces lo que haremos es definir el filtro para los recursos dentro de private
01 @WebFilter(filterName="Security", urlPatterns={"/private/*"})
02 public class Security implements Filter
Ahora hemos definido el filtro para lo que se encuentre definido en 'private'.

sábado, 27 de noviembre de 2010

Tercera semana

En cuanto a Java esta semana, hemos visto un poco como podíamos hacer para tener el control de las páginas para solo ser vistas por usuarios autorizados. Hemos visto una introducción a las cookies y las sesiones. Una de las principales diferencias entre ambas, es que la información de las cookies se guarda en el cliente, y la información de las sesiones se guarda en la parte del servidor.
Para probar las cookies, hemos hecho una aplicación web con una pantalla de login, un registro de usuario y una  pagina principal que a la cual entramos una vez hemos realizado el login. Para evitar que después de autenticarse, un usuario pueda entrar en la página home u otra dentro de la web sin pasar por el login, hemos añadido un código en cada página, que comprueba mediante las cookies, que el usuario ya ha sido validado.

Otra cosa que se ha comentado un poco, hemos visto un algoritmo para hacerlo, es el encriptar la contraseña del usuario. Una vez que enviamos la contraseña del cliente al servidor, allí la encriptamos y la guardamos en base de datos. En el servidor todo el tratamiento que le demos a la contraseña, se hará estando encriptada, de esta manera conservamos su privacidad.

Por fin esta semana hemos instalado Flash Builder( basado en Eclipse), la versión 4 de Flex y la versión 3 de ActionScript. Es una mejora enorme respecto a el entorno de desarrollo que hemos utilizado hasta ahora, asistente de código, desarrollo visual de las pantallas, asistentes para conexión a servicios web...
Con Flex, hemos aprendido algunos componentes para la navegación por una aplicación, por ejemplo el TabNavigator, ViewStack, Accordion. Con estos controles podemos navegar entre distintas opciones o formularios dentro de nuestra aplicación, uno de los más conocidos por todos son las pestañas(tabs).

Dentro de la parte de los formularios, hemos aprendido a validar los campos y a formatear las entradas de los usuarios, de esta manera cuando vayamos a enviar el formulario al servidor nos aseguramos que mandamos todos los datos necesarios en el formato que necesitamos.
El viernes hemos visto un ejemplo de integración de Flex con Java, de esta manera ya tenemos todo el ciclo cerrado, y somos capaces de desarrollar una interfaz en Flex que se comunica con la parte Java en el servidor, para poder por manipular la información que tenemos en la base de datos y poder mostrarla en el navegador.
En cuanto a ejercicios que hemos hecho esta semana, podemos ver una aplicación en Flex para autenticar y registrar un usuario. También se ha propuesto para la semana que viene integrarla con la parte del servidor, java y MySQL. Una aplicación que me ha gustado es el desarrollo del juego del ahorcado hecho con Flex.

domingo, 21 de noviembre de 2010

Dos Semanas

Bueno pues ya han pasado dos semanas de curso. Esta semana hemos empezado con Java, iremos alternando Flex y Java para al final programar con los dos juntos, el front-end con Flex y el back-end con Java.
Hemos estado aclarando algunos conceptos básicos de Java, como clases, objetos, herencia, interfaces... También se ha hablado un poco de metodología, de forma de hacer las cosas y trabajar en equipo.
En cuanto a Java hemos pasado rápidamente a lo que nos va a interesar más, a la parte del servidor. Estamos haciendo muchos ejemplos sobre Servlets y JSP, que digamos es el comienzo para poder hacer una aplicación web. Las aplicaciones las estamos desarrollando en NetBeans y las desplegamos en el servidor GlashFish.
Otra cosa que también estamos utilizando es la parte de Java para el manejo de bases de datos, JDBC. Para ello estamos utilizando el servidor MySQL.
Como novedad esta semana hemos empezado con el curso de ingles, hemos dado un día de clase, y aunque parecía que iba a ser demasiado cinco horas seguidas, la clase a sido amena, con actividades en la que hemos participado todos.
Pues nada más, otra semana bastante completa y llena de cosas nuevas. Con lo que llevamos de curso, se podría decir que seria capaz de hacer ya alguna pequeña aplicación en Flex con Java, aunque todavía nos quedan muchos puntos por aprender.

domingo, 14 de noviembre de 2010

Una Semana

Bueno, pues ya hemos cumplido la primera semana de curso, aunque solo han sido tres días de clase. La verdad es que por ahora el curso esta cumpliendo mis expectativas. Hace unos años hice un curso parecido a este pero cubría otras tecnologías, y os puedo asegurar que con el ritmo que llevamos ya lo veo más interesante y mucho mejor.
El temario que hemos visto esta semana ha sido bastante, con lo que hemos aprendido se pueden hacer algunas cosas ya, y si uno domina algún lenguaje de servidor, incluso puede hacer el mantenimiento de alguna base de datos que tenga. Hemos visto una introducción a lo que significa RIA y la hemos enfocado a Flex.
De Flex hemos aprendido la estructura básica de una aplicación, algunos componentes para poder hacer formularios y enseñar información, como compilarlo y probarlo en un navegador. Aparte de crear pantallas también sabemos como a través de HTTP llamar a servicios, recoger la información y presentarla de una manera  amigable para el usuario.

Otra cosa que me gusta, es que aparte del temario, estamos viendo temas interesantes. Por ejemplo hacen mucho hincapié en Web 2.0, de esta manera estamos viendo herramientas de Google, tenemos que tener un blog con información del curso y sobre lo que queramos, miraremos redes sociales...

sábado, 13 de noviembre de 2010

Mi primera entrada

Hola a todos mis posibles lectores. He creado este blog en un curso sobre aplicaciones RIA con Flex y Java que hemos empezado esta semana. Durante el curso os iré hablando sobre lo que aprendemos, noticias de interés, e intentare escribir cosas sobre Flex y Java que espero que sean útiles. Espero veres por aquí muy a menudo.