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:
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:
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.
¡Únete a la conversación!