SPRINGFRAMEWORK

Implementación de Spring Security en una aplicación Vaadin

11 mayo, 2020

Hoy voy a escribir un poco sobre mi experiencia en tratar de dar seguridad a una aplicación simple de Vaadin usando uno de los frameworks de seguridad más populares: las extensiones de seguridad de SpringFramework.
Esta publicación abordará la parte de realizar una configuración predeterminada para que funcione, por supuesto que después de esto, tendremos muchas cosas para hacer en el proyecto para terminar de implementarlo, como almacenar y recuperar los datos de usuario de la base de datos utilizada, elegir el algoritmo de encriptación de contraseña, etc. Pero al menos tendrás una visión general de lo que se debe hacer para lograr esto.

Punto de partida

El primer requisito que necesitarás para crear esta aplicación será Maven, con la que puedes crear una aplicación en blanco con el siguiente comando:

mvn archetype:generate
 

Después de ejecutar dicho comando, maven enumerará vario arquetipos predefinidos, puedes filtrar esa lista usando una palabra clave. Si ingresas “vaadin”, la lista se acortará, selecciona “com.vaadin: vaadin-archetype-application”. Después de ingresar toda la información requerida (utilizamos la versión 8.1.5 de Vaadin), Maven creará una pequeña aplicación que puede compilar, empaquetar y ejecutar utilizando una configuración de Jetty incorporada con solo iniciar este comando:

mvn jetty:run

Después de eso, estás listo para seguir con el resto de pasos.

Usemos Spring Framework

Lo primero que deberás hacer es agregar la dependencia de Spring Framework a tu proyecto. Para lograr esto, deberás modificar el archivo pom.xml de tu proyecto y agregarlo dentro de la sección <dependencies>:

<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-spring</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>

Esto agregará todas las dependencias requeridas que necesitarás para implementarlo. Estamos considerando usar 4.2.3.RELEASE, que es la última versión estable de esa parte del framework al momento de escribir este artículo. Y también, utilizamos el complemento Vaadin-Spring versión 2.0.1 (última versión estable).

Agregar clases

Con Spring Framework y la especificación Servlet 3.0, puedes deshacerte de todas las configuraciones xml antiguas y simplemente crear algunas clases para configurar el framework. Vamos a necesitar la creación de:

  • Clase User model: Esta clase modelará el usuario que está actualmente logueado. tiene que implementar la interfaz org.springframework.security.core.userdetails.UserDetails, que obligará a implementar algunos métodos, de los cuales los siguientes son importante mencionar:
    • getUsername & getPassword: estos dos métodos devuelven el nombre de usuario y la contraseña almacenada del usuario logueado.
    • getAuthorities: este método devuelve los permisos otorgados, es útil para elegir qué funcionalidades de su aplicación el usuario puede ver/ejecutar.
    • isAccountNonExpired, isAccountNonLocked, isCredentialsNonExpired y isEnabled: estos métodos son útiles si deseamos aplicar diferentes políticas de seguridad para controlar la disponibilidad de usuarios / credenciales.
  • User Service: es la clase responsable de cargar el modelo mencionado en el punto anterior desde la base de datos.En este pequeño ejemplo, esta clase solo está creando y devolviendo un nuevo Usuario simple.
  • SecurityConfig: esta es la clase que controla la configuración de seguridad de la aplicación. Hay muchas cosas interesantes en esta clase para mencionar:
    • A través del método autenticaciónProveedor (), estamos configurando el servicio anterior como el mecanismo para recuperar el usuario de la base de datos.
    • El método configure () es el más importante y permite establecer varias configuraciones. Estamos utilizando los mínimos posibles para permitir algunos patrones no protegidos de URL (como la página del formulario de inicio de sesión) y restringir todo lo demás para permitir solo el acceso a los usuarios registrados.
    • También estamos definiendo algunas configuraciones estándar con respecto a la sesión utilizando el método sessionControlAuthenticationStrategy().
    • Otro punto interesante es crear un Registro de sesión, que es una clase que permitirá a Spring almacenar los detalles de las sesiones de seguridad en la memoria.
    • Finalmente, hay un método encoder () que nos permitirá encriptar la contraseña, por lo que no se almacenará ninguna contraseña sin encriptar en la base de datos. Solo por tratarse de un ejemplo simple, estamos usando un NoOpPasswordEncoder.
  • SecurityWebApplicationInitializer: esta clase será responsable de asignar la clase SecurityConfig como la clase base de la configuración de Spring.
  • LoginUI: Debido a que vamos a resguardar algunas URL y a otras las dejaremos sin resguardar, necesitamos crear una nueva UI que mostrará el formulario de inicio de sesión. En esta clase estamos usando un componente interesante de Vaadin: el LoginForm, que generará un formulario de inicio de sesión en vaadin usando algunas características interesantes como poder decirle al navegador que recuerde las credenciales del usuario.
Finalmente, tenemos que modificar MainUI para permitir el uso de un SpringVaadinServlet en lugar del predeterminado y, también, agregaremos un botón de logout, que hará el proceso de cierre de sesión, invocando alguna clase de seguridad de Spring.
Después de agregar estas clases, estarás listo para probar la aplicación. Si se intenta acceder a la URL predeterminada, será redirigido a la interfaz de usuario de inicio de sesión y se le pedirán sus credenciales. Simplemente ingrese “admin” como nombre de usuario y “admin” como contraseña y se le otorgará el acceso a la aplicación.
Después de eso, si hace clic en el botón cerrar sesión, se cerrará la sesión de la aplicación y luego se lo redirigirá a la página de inicio de sesión.
Eso es todo. El código fuente está disponible en un pequeño proyecto de Github, por lo que si lo deseas, puedes echar un vistazo allí. Si tienes algún problema por favor coméntanos!
Espero que esto les sea de utilidad.
Martín López
By Martín López

Ingeniero en Sistemas, programar es mi pasión. Tengo experiencia en el ecosistema Java en General, y frameworks tales como Vaadin, Spring y Hibernate. Siempre dispuesto a ayudar a las empresas a diseñar workflows de construcción y como usar las herramientas correctas para construir software de alta calidad.

¡Únete a la conversación!
Profile Picture

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.