Introducción
En el mundo de desarrollo de software, la seguridad es un aspecto crucial que no puede ser ignorado. En este artículo, te mostraremos cómo puedes mejorar la seguridad de tus servicios REST utilizando Spring Boot y JSON Web Tokens (JWT). Este tutorial es una continuación de nuestros artículos anteriores donde discutimos cómo crear un proyecto con Spring Boot y cómo añadir conectividad con la base de datos a través de Spring Data y JPA.
Autenticación y Autorización en Servicios REST
Cuando lanzamos nuestro proyecto, todos nuestros servicios quedan accesibles a cualquiera con acceso a nuestro servidor. Sin embargo, en la mayoría de los casos, queremos tener una parte pública, accesible a cualquier usuario, y una parte privada a la que solo usuarios registrados en nuestro sistema deberían tener acceso. Para lograr esto, necesitamos implementar mecanismos de autenticación y autorización.
En este tutorial, vamos a hacer uso de JWT para autenticar a nuestros usuarios y usaremos la librería de Spring Security para autorizar a aquellos usuarios con un token válido a acceder a nuestros servicios.
Añadiendo Dependencias de Spring Security y JWT
Lo primero que necesitamos es añadir las dependencias de Spring Security y JWT a nuestro archivo pom.xml. Aquí te mostramos cómo hacerlo:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
Configurando Spring Security y JWT
Una vez que hemos añadido las dependencias necesarias, necesitamos configurar Spring Security y JWT en nuestro proyecto. Esto implica la creación de varias clases y configuraciones, incluyendo:
UserDetailsServiceImpl
: Esta clase implementa la interfazUserDetailsService
de Spring Security, que nos permite recuperar los datos del usuario y devolver un objeto de tipoUserDetails
.JWTAuthenticationFilter
yJWTAuthorizationFilter
: Estos filtros se utilizan para generar el token JWT cuando el usuario se autentica y para validar el token en cada petición al servidor, respectivamente.WebSecurityConfig
: Esta clase de configuración de Spring Security nos permite definir nuestras políticas de seguridad, como las URL que requieren autenticación, los filtros que se deben aplicar, entre otros.
Aquí te mostramos cómo se ven estas clases y configuraciones en código:
// Ejemplo de UserDetailsServiceImpl
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
// ...
}
// Ejemplo de JWTAuthenticationFilter
public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
// ...
}
// Ejemplo de JWTAuthorizationFilter
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
// ...
}
// Ejemplo de WebSecurityConfig
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurity extends WebSecurityConfigurerAdapter {
// ...
}
Creando Usuarios y Roles
Una vez que hemos configurado Spring Security y JWT, podemos empezar a crear usuarios y roles en nuestro sistema. Para esto, creamos un controlador UserAccountController
que nos permite registrar usuarios con dos roles distintos: USER y ADMIN.
@RestController
@RequestMapping("/users")
public class UserAccountController {
// ...
}
Probando la Seguridad de Nuestros Servicios REST
Finalmente, una vez que hemos configurado la seguridad de nuestros servicios REST y hemos creado usuarios y roles, podemos probar nuestra aplicación. Para esto, levantamos el servidor y utilizamos Swagger o cualquier otra herramienta de prueba de APIs para enviar peticiones a nuestros servicios.
Conclusión
En este artículo, hemos visto cómo podemos mejorar la seguridad de nuestros servicios REST utilizando Spring Boot y JWT. Hemos discutido cómo configurar Spring Security y JWT, cómo crear usuarios y roles, y cómo probar nuestra aplicación. Puedes ver el código completo del proyecto en las referencias.