Comprobar un password de usuario manualmente en Grails, saltandose el proceso de Spring Security

El plugin de grails de SpringSecurity ofrece un montón de funcionalidad maravillosa, pero no pone las cosas fáciles para algunas tareas. Por ejemplo, en el típico caso de querer cambiar una contraseña, donde hay que comprobar el password viejo antes de establecer el nuevo, no existe documentación  al respecto.

Tras mucho investigar y leer código, la solución al final es bastante sencilla:

springSecurityService.passwordEncoder.isPasswordValid(user.password, oldPassword, null)

El último parámetro, en lugar de null, debe ser el tipo de salt que utilices. En el caso de Bcrypt se ignora, por lo que está bien pasar null

Aplicación en Grails que se reinicia sin parar

Hace un rato me ha ocurrido algo muy curioso con grails. He parado el servidor y al volver a ejecutar grails run-app una vez que terminaba de arrancar se ponía a recompilar unas clases y volvía a arrancar en un bucle infinito.

Server running. Browse to http://localhost:8080/
  [groovyc] Compiling 1 source file to /home/ivan/workspace-sts/myApp/target/classes
  [groovyc] Compiling 1 source file to /home/ivan/workspace-sts/myApp/target/classes
   [delete] Deleting directory /home/ivan/.grails/1.3.7/projects/myApp/tomcat
Running Grails application..
2011-10-17 16:42:19,231 [main] INFO  spring.BeanBuilder  - [RuntimeConfiguration] Configuring data source for environment: DEVELOPMENT

He ejecutado varias veces grails-clean por si se había quedado algo raro pero seguía sin funcionar. Al final, la solución es arrancar con grails run-app –verboseCompile (cuidado que son dos guiones) para obtener información adicional. Así, una vez arrancado muestra las clases que intenta recompilar (en negrita):

Server running. Browse to http://localhost:8080/
  [groovyc] Compiling 1 source file to /home/ivan/workspace-sts/myApp/target/classes
  [groovyc] /home/ivan/workspace-sts/myApp/src/groovy/com/auth/MySuccessHandler.groovy
  [groovyc] Compiling 1 source file to /home/ivan/workspace-sts/myApp/target/classes
  [groovyc] /home/ivan/workspace-sts/myApp/src/groovy/com/auth/MySuccessHandler.groovy
   [delete] Deleting directory /home/ivan/.grails/1.3.7/projects/myApp/tomcat
Running Grails application..

Era una clase de una prueba anterior, así que la he borrado y todo se ha solucionado 🙂

Redireccionar después del login con spring-security-core

En un proyecto personal estoy utilizando Grails junto con spring security core para la autenticación de los usuarios.
Cuando intentamos acceder a una url que hemos configurado para permitir el acceso sólo a usuarios autenticados, el plugin nos redirige a la vista de login. Una vez autenticados nos redirecciona a la url a la que queríamos acceder inicialmente. Pero ¿qué ocurre si queremos redireccionar siempre a una url concreta?.

La solución pasa por añadir en la vista auth.gsp lo que marco en negrita:

<form action='${postUrl}?spring-security-redirect=/url-a-redireccionar'
method='POST' id='loginForm' class='cssform' autocomplete='off'>

Y eso es todo. Después de autenticarse, el usuario es redireccionado a la url elegida.