Saltar al contenido

Ejemplo simple de Spring Security con Thymeleaf

Ya no busques más por internet ya que has llegado al espacio correcto, tenemos la solución que necesitas pero sin liarte.

Solución:

De la documentación de Spring Security

La protección CSRF está habilitada de forma predeterminada con la configuración de Java. Si desea deshabilitar CSRF, la configuración de Java correspondiente se puede ver a continuación. Consulte el Javadoc de csrf() para obtener personalizaciones adicionales sobre cómo se configura la protección CSRF.

Y, cuando la protección CSRF está habilitada

El último paso es asegurarse de incluir el token CSRF en todos los métodos PATCH, POST, PUT y DELETE.

En tu caso:

  • tiene la protección CSRF habilitada de forma predeterminada (porque está utilizando la configuración de Java),
  • está enviando el formulario de inicio de sesión mediante HTTP POST y
  • no incluyen el token CSRF en el formulario de inicio de sesión. Por este motivo, su solicitud de inicio de sesión se deniega al enviarla porque el filtro de protección CSRF no puede encontrar el token CSRF en la solicitud entrante.

Ya ha determinado las posibles soluciones:

  1. Deshabilitar la protección CSRF como http.csrf().disable(); o
  2. Incluya el token CSRF en el formulario de inicio de sesión como un parámetro oculto.

Dado que está utilizando Thymeleaf, deberá hacer algo como lo siguiente en su plantilla HTML para la página de inicio de sesión:

...

Tenga en cuenta que debe utilizar th:action y no HTML action ya que el procesador Thymeleaf CSRF solo se activará con el primero.

Puede cambiar el método de envío del formulario a GET solo para superar el problema, pero eso no se recomienda ya que los usuarios enviarán información confidencial en el formulario.

Por lo general, creo un fragmento de Thymeleaf que luego se usa en todas las páginas con formularios para generar el marcado para los formularios con el token CSRF incluido. Esto reduce el código repetitivo en toda la aplicación.


Utilizando @EnableWebMvcSecurity en vez de @EnableWebSecurity para habilitar la inyección automática de token CSRF con etiquetas Thymeleaf. También usa

en vez de

con Spring 3.2+ y Thymeleaf 2.1+ para obligar a Thymeleaf a incluir el token CSRF como un campo oculto automáticamente (fuente Spring JIRA).

Aquí está la solución que lo implementa exactamente de la manera que OP quería:

  1. Reemplazar @EnableWebSecurity con @EnableWebMvcSecurity (eso es lo que falta OP)
  2. Usar th:action sobre
    etiqueta

cuando usas @EnableWebMvcSecurity Spring Security registra el CsrfRequestDataValueProcessory cuando usas th:action thymeleaf usa su getExtraHiddenFields método para agregar, bueno, campos extra ocultos al formulario. Y el csrf es el campo extra oculto.

Desde Spring Security 4.0, @EnableWebMvcSecurity ha quedado obsoleto y solo es necesario @EnableWebSecurity. La protección _csrf continúa aplicándose automáticamente.

Debe agregar el dialecto Spring Security de Thymleaf.

1.) Agregue el módulo Spring Security Dialect a su classpath.

Ejemplo experto:


    org.thymeleaf.extras
    thymeleaf-extras-springsecurity3
    2.1.2.RELEASE

2.) Agregue el objeto SpringSecurityDialect a su SpringTemplateEngine

import org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect;
templateEngine.addDialect(new SpringSecurityDialect()); //add this line in your config

Fuente: Primavera en Acción 4ª Edición

Te mostramos comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *