Secciones

¿Cómo proteger tus llamadas Ajax en Grails?

Inicio » Artículos » ¿Cómo proteger tus llamadas Ajax en Grails?
La categoría del artículo es
Escrito el 1 October 2010, 15:43


Yo creo que nunca en ningún entorno de desarrollo fue tan sencillo proteger las llamadas AJAX que realizas en tus aplicaciones web. Imaginemos el caso que tenemos una aplicación con la típica navegación por pestañas y que todo se carga en la parte inferior de esas pestañas.

Esta característica de nuestra aplicación la vamos a implementar con una etiqueta en Grails que se llama remoteLink y que permite especificarle, entre otros parámetros, un controlador, una acción y un elemento del DOM del HTML para que lo actualice con la información correspondiente que le venga de la llamada a la acción del controlador invocado.

Por ejemplo, imagina la típica pestaña de usuarios que nos permite listarlos. Podríamos tener algo así.

Groovy:
<html>
<head>
        <title>Mi aplicación web</title>
        <g:javascript library="scriptaculous" />
</head>
<body> 
        <ul>
                <li><g:remoteLink controller="ajax" action="listarusuarios" update="contenido">Listar usuarios</g:remoteLink></li>
                <li><g:remoteLink controller="ajax" action="listarempresas" update="contenido">Listar empresas</g:remoteLink></li>
                <li><g:remoteLink controller="ajax" action="listarsocios" update="contenido">Listar socios</g:remoteLink></li>
        </ul>   
        <div id="contenido">

        </div>
</body>
</html>
 

Es importante recordar que para poder utilizar la llamada a la etiqueta remoteLink debemos importar por ejemplo la librería de scriptaculous.

De esta forma, cada vez que el usuario haga click en cualquiera de las opciones, la información se cargará automáticamente en el div con identificador contenido y no tenemos que recargar la página por completo. Pero, ¿que pasa si alguien intenta acceder a la URL que carga ese contenido AJAX, por ejemplo, http://localhost:8080/miapp/ajax/listarusuarios? Pues que se vería el contenido de la llamada pero totalmente fuera del contexto que nosotros queremos, lo que podría provocar algún que otro problema en nuestra aplicación.

¿Cómo podríamos evitar esto? Pues muy sencillo. En Grails tenemos el concepto de filtros que nos permiten ejecutar antes y después de llamar acciones en los controladores e incluso después de que la vista de nuestra aplicación sea generada. Estos filtros son clases normales en Groovy que se deben alojar en el directorio de configuración de nuestra aplicación y cuyo nombre debe terminar por la palabra Filters. Nosotros crearíamos un filtro llamado SeguridadFilters.groovy en el directorio grails-app/conf con el siguiente contenido:

Groovy:
class SeguridadFilters {
        def filters = {
                llamadasajax(controller:'ajax', action:'*') {
                    before = {
                        def xrequestedwith = request.getHeader("X-Requested-With")
                        if (xrequestedwith != "XMLHttpRequest")
                            redirect(controller:'public', action:'error')
                    }
                }
        }
}

 

Aunque el código es bastante sencillo de entender, voy a tratar de explicarlo un poco. En primer lugar, le estamos indicando al filtro que cualquier llamada a una acción del controlador AjaxController me la capture y me permite realizar una serie de llamadas de comprobaciones. Esa comprobación consiste en saber si la cabecera X-Requested-With de nuestra petición coincide con la cabecera que se añade en las llamadas Ajax que es XMLHttpRequest y en caso de que no coincida, redirijo al usuario a una página de error.

Sencillo, ¿no crees? Creo que he tardado más en explicarlo que en hacerlo en la aplicación en la que estoy trabajando actualmente, que en cuanto la termine os podré contar más cosas interesantes sobre ella y sobre su forma de trabajo. Sólo adelanto que trabajamos con metodologías ágiles y con gente muy dispersa geográficamente hablando.


Espero tus comentarios...

Ayuda Textile