Buenas prácticas y tutoriales

Cómo configurar la autenticación OAuth2 con Spring-Security-Oauth2

Como habrás podido comprobar en mis anteriores entradas del blog, soy un gran fan de Spring + Java y Spring + Kotlin. En consecuencia, siempre que necesito implementar una autenticación OAuth 2.0, la librería spring-security-oauth2 es una elección natural.

Sin embargo, no hay casi nada que muestre cómo unir Spring Security y OAuth2 - conectando spring-seguridad-oauth2 con diferentes fuentes de datos que no sean inMemory y JDBC. Como tenemos que configurar un montón de cosas, voy a dividir este tutorial en 3 partes: Cómo autenticar un usuario, cómo configurar un almacén de fichas y cómo configurar clientes dinámicos. Así que, ¡manos a la obra!

En primer lugar, supongo que está utilizando una de las últimas versiones de spring-seguridad-oauth2:

En segundo lugar, estoy usando Couchbase con Spring Data. Si utilizas cualquier otra fuente de datos, puedes reutilizar gran parte del código de este blog.

Además, he añadido Lombok como dependencia para reducir el boilerplate de Java:

Vamos a configurar nuestro Servidor de Recursos, de acuerdo con la documentación de Spring Security relativa a spring-seguridad-oauth2: "Un Servidor de Recursos (puede ser el mismo que el Servidor de Autorización o una aplicación separada) sirve recursos que están protegidos por el token OAuth2. Spring OAuth proporciona un filtro de autenticación Spring Security que implementa esta protección. Puede activarlo con @HabilitarServidorDeRecursos en un @Configuración y configurarlo (según sea necesario) utilizando un ResourceServerConfigurer".

 

Ahora, implementemos una interfaz llamada ServicioDeDetallesDelUsuario. Es la interfaz responsable de ser el puente entre su fuente de datos y Spring Security OAuth:

En el código anterior, estamos devolviendo una clase del tipo DetallesDelUsuarioque también es de Spring. Aquí está su implementación:

Podría haber hecho que la clase User implementara directamente UserDetails. Sin embargo, como mi caso de uso también requiere la lista de grupos en los que se encuentra el usuario, he añadido la implementación anterior.

Este es el aspecto de User, SecurityGroup y sus respectivos repositorios:

En Entidad básica es también un pequeño hack para trabajar mejor con Spring Data y Couchbase:

 

Finalmente, aquí está la implementación de nuestra clase SecurityConfig:

 

En Spring-Boot 2.0 ya no podemos inyectar directamente el bean AuthenticationManager, pero sigue siendo necesario para el framework Spring Security. Por lo tanto, tenemos que implementar un pequeño hack con el fin de obtener acceso a este objeto:

Vamos a dividir esta clase en pequeños trozos para entender lo que está pasando:

La contraseña de mi usuario está en texto plano, así que simplemente devuelvo una nueva instancia de NoOpPasswordEncoder. Un estándar común es devolver una instancia de la clase BCryptPasswordEncoder.

Por ahora, vamos a utilizar un almacén de tokens en memoria, veremos en la parte 2 cómo utilizar también Couchbase como almacén de tokens.

Aquí es donde ocurre la magia con OAuth2 y Spring Boot. Específicamente, le estamos diciendo a Spring que use nuestro CustomUserDetailsService para buscar usuarios. Este bloque de código es la parte central de lo que hemos hecho hasta ahora.

Este bloque nos permitirá realizar peticiones utilizando CORS (Cross-Origin Resource Sharing)

Y por último, si necesitas llamar a tu API a través de JQuery, también necesitas añadir el código anterior. De lo contrario, obtendrá un mensaje "La respuesta para la verificación previa no tiene el estado HTTP ok." Error.

Ahora sólo queda una cosa, necesitamos añadir un Servidor de Autorización:

Bien hecho, ahora puedes iniciar tu aplicación y llamarla a través de Postman o Jquery:

 

Aumentar el rendimiento

Si utilizas Couchbase, te sugiero que utilices el nombre de usuario como clave de tu documento. Esto le permitirá utilizar el Almacén clave-valor en lugar de ejecutar consultas N1QL, lo que aumentará significativamente el rendimiento de su inicio de sesión.

 

Si tienes alguna pregunta sobre Couchbase, seguridad OAuth u optimización de Spring y autenticación OAuth2, envíame un tweet a @deniswsrosa

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Denis Rosa, Defensor del Desarrollador, Couchbase

Denis Rosa es un Developer Advocate para Couchbase y vive en Munich - Alemania. Tiene una sólida experiencia como ingeniero de software y habla con fluidez Java, Python, Scala y Javascript. A Denis le gusta escribir sobre búsqueda, Big Data, AI, Microservicios y todo lo que pueda ayudar a los desarrolladores a hacer una aplicación hermosa, más rápida, estable y escalable.

1 Comentarios

  1. Muy buen artículo. ¿Podría compartir el código de este post?

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.