Está en la página 1de 12

3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

REFACTORIZANDO
(HTTPS://REFACTORIZANDO PROGRAMACIÓN, TUTORIALES Y ARTÍCULOS

Spring (https://refactorizando.com/category/framework/spring-framework/) Últimas entradas


Integración de keycloak con Spring Boot Per les en Spring Boot
 8 meses hace Noel Rodríguez Calle (https://refactorizando.com/author/admin/) (https://refactorizando.com/per les-
spring-boot/)

Entender Tolerations y Taints en


Kubernetes
(https://refactorizando.com/tolerations-
taints-kubernetes/)

Cuándo usar ClusterIP Vs LoadBalancer


Vs NodePort Vs ingress en Kubernetes
(https://refactorizando.com/clusterip-vs-
loadbalancer-vs-nodeport-vs-ingress-en-
kubernetes/)

Mock AWS con Localstack en Spring Boot


(https://refactorizando.com/mock-aws-
localstack-spring-boot/)

Base de Datos en memoria H2 con Spring


Boot (https://refactorizando.com/base-
de-datos-memoria-h2-spring-boot/)

En esta nueva entrada vamos a ver como realizar la integración de Keycloak


(https://www.keycloak.org/) con Spring Boot através de un ejemplo. Este tipo de
integración es de vital importancia en arquitectura de microservicios
(https://refactorizando.com/arquitectura-de-microservicios/), en el que delegas la
autenticación a un tercero.

¿Qué es Keycloak?
Como nos dice su página web, keycloak es un Open Source Identity and Access
Management.

Keycloak esta escrito en Java y es compatible con los protocolos SAML v2 y OpenID
Connect (OIDC)/OAuth2. Además se encuentra soportado por la RedHat y se encuentra
bajo licencia de Apache.

La idea detrás de Keycloak es asegurar la protección de las aplicaciones modernas


facilitando la integración con las mismas.
Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 
SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 1/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Keycloak nos proporciona características tales como SSO, centralizar los diferentes
métodos de autenticación, control sobre las identidades digitales, control y gestión de
usuarios. Y además permite centrarse en el desarrollo del servicio sin tener que enfocarse
en la autenticación.

A continuación veremos como integrar nuestra aplicación de Spring Boot con keycloak.

Arrancar y con gurar Keycloak


La manera más rápida de arrancar keycloak es mediante su imágen docker por lo que
vamos a introducir el siguiente comando:
1. docker run -p 8081:8080 -e KEYCLOAK_USER=admin -e
KEYCLOAK_PASSWORD=password jboss/keycloak -
Dkeycloak.profile.feature.docker=enabled -b 0.0.0.0

Una vez se ha descargado la imagen y arranca en el puerto 8081 (o el que pre eras),
vamos a ir a la consola de administración mediante la siguiente url:

http://localhost:8081/auth/admin/master/console/
(http://localhost:8081/auth/admin/master/console/)

Pantalla Login Keycloak

Para poder acceder, utiliza admin y password como usuario y contraseña.

En la pantalla de keycloak que veremos nos vamos a logar con admin y la contraseña
password, que son con las que hemos arrancado la imagen de keycloak.

Crear un Realm
Un Realm en Keycloak se re ere a un objeto que gestion un conjunto de usuarios con
sus credenciales roles y grupos.

Al arrancar keycloak nos hemos logado con el default Master realm, así que vamos a crar
uno propio.

Despues de logarnos vamos a navegar hasta la parte superior izquierda y situar el ratón
sobre Master, por encima de Realm Settings, y aparecerá el botón Add realm:

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 2/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Añadir realm en Keycloak

Al pulsar sobre ese botón aparecerá la pantalla para añadir un nuevo realm, vamos a crear
uno nuevo que se llave SpringBootExample.

Crear nuevo realm

Al pulsar sobre create, un nuevo realm será creado, y las próximas operaciones que vamos
a realizar se harán sobre este realm.

Crear un client
Aunque keycloak viene con algunos clientes ya creados vamos a crear uno nuevo, que
llamaremos login. Para ello vamos a pulsar sobre client y add client:

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  
Creación de nuevo cliente en Keycloak

https://refactorizando.com/integracion-keycloak-spring-boot/ 3/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Nuestro nuevo cliente se llamará login

Url de redirección despues del Login en Keycloak

Una vez que hemos creado el login, además estableceros la url de redirección después del
login en nuestro caso será la de nuestra aplicación Spring Boot que hemos arrancado, que
se encontrará en el puerto 8082.

Crear un rol y usuario


El sistema de keycloak esta basado en un sistema de acceso basado en roles por usuario.
Por lo que vamos a crear un rol y asociarselo a un usuario. Para crear un nuevo rol vamos a
pulsar sobre role, y add Role.

Creación de role User

Añadir rol de usuario

A continuación vamos a crear un usuario al que le asociaremos los roles que hemos
generado.

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 4/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Creación usuario

A continuación le creamos la password al usuario, será con la clave 12345.

Creación de la Password del usuario

Al crear la password del usuario tenemos la opción de dejar Temporary, en On o Off que
signi ca que se le obligará a cambiar el usuario cuando se conecte por primera vez.

A continuación vamos a asociar los roles que hemos creado, en este caso admin y user a
nuestro user1.

Asociar rol a usuario

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 5/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Asociar roles a un usuario

Si hemos seguido todos los pasos keycloak ha quedado con gurado, para poder generar
un token de autenticación.

Generar Access Token


Una vez hemos completado todo el procesos de generación de realm, clients, roles y
usuarios, es el momento de generar el token, que lo haremos mediante un POST con una
llamada HTTP:
1. 'http://{IP}:{PORT}/auth/realms/{REALM_NAME}/protocol/openid-
connect/token'
2. {
3. 'client_id': 'client',
4. 'username': 'username',
5. 'password': 'password',
6. 'grant_type': 'password'
7. }

Para ello vamos a realizar el siguiente curl:

curl --example --request POST 'http://{IP}:{PORT}/auth/realms/{REALM_NAM


E}/protocol/openid-connect/token'
--header 'Content-Type: application/x-www-form-urlencoded' --data-urlenc
ode 'grant_type=password'
--data-urlencode 'client_id=login' --data-urlencode 'username={user_nam
e}'
--data-urlencode 'password={user_pwd}'

A continuación realizamos un POST con nuestro ejemplo:

curl --location --request POST 'http://localhost:8081/auth/realms/Spring


BootExample/protocol/openid-connect/token' --header 'Content-Type: appli
cation/x-www-form-urlencoded' --data-urlencode 'grant_type=password' --d
ata-urlencode 'client_id=login' --data-urlencode 'username=user1' --data
-urlencode 'password=12345'

1. {
2. 'client_id': 'client',
3. 'username': 'your_username',
4. 'password': 'your_password',
5. 'grant_type': 'password'
6. }

Si te es más comodo puedes usar Postman para realizar la llamada HTTPS.


Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 
SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 6/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

Una vez realizada la petición obtendremos un access_token y un refresh_token. En el


caso en el que el token se nos expire podremos realizar una invocación a la misma url pero
con el refresh token en la petición:
1. {
2. 'client_id': 'client_id',
3. 'refresh_token': refresh_token,
4. 'grant_type': 'refresh_token'
5. }

Ejemplo Spring Boot con Keycloak para mostrar la


Integración de keycloak con Spring Boot
A continuación vamos a realizar un ejemplo en el mediante el acceso con roles
permitiremos que un usuario pueda acceder a una aplicación.

Con guración Maven de Spring Boot con Keycloak


Keycloak nos proporciona un starter para aprovechar la autocon guración añadiendolo
como dependencia maven:
1. <dependency>
2. <groupId>org.keycloak</groupId>
3. <artifactId>keycloak-spring-boot-starter</artifactId>
4. </dependency>

y además hay que añadir el distributionManagement de keycloak:


1. <dependencyManagement>
2. <dependencies>
3. <dependency>
4. <groupId>org.keycloak.bom</groupId>
5. <artifactId>keycloak-adapter-bom</artifactId>
6. <version>12.0.1</version>
7. <type>pom</type>
8. <scope>import</scope>
9. </dependency>
10. </dependencies>
11. </dependencyManagement>

Con guración de la Seguridad


La dependencia que hemos añadido de Keycloak, nos va a proporcionar un
WebSecurityCon gurer (https://docs.spring.io/spring-
security/site/docs/4.0.x/apidocs/org/springframework/security/con g/annotation/web/WebSecurityCon gurer.html),
a través de la clase KeycloakWebSecurityCon gurerAdapter. De todos modos, esta clase
no es imprescindible ya que la autocon guración que nos proporciona será en un principio
su ciente para establecer una autenticación. De todos modos, esta clase nos facilita el
contexto de seguridad sobre escribiendo algunas clases. En nuestro ejemplo vamos a
sobre escribirla para verlo mejor y poder dar autorización a nuestros endpoints mediante
roles.
1. @Configuration
2. @EnableWebSecurity
3. @EnableGlobalMethodSecurity( prePostEnabled = true,
4. securedEnabled = true,
5. jsr250Enabled = true)
6. public class KeycloakSecurityConfig extends
KeycloakWebSecurityConfigurerAdapter {
7.
8. @Autowired
9. public void configureGlobal(AuthenticationManagerBuilder auth)
Frameworks
throwsException Patrones
{ y Arquitectura Plataformas  Base De Datos Lenguajes 
SpringQuarkusMicronautHibernate
10. KeycloakAuthenticationProvider Kuberneteskafka GraphQLKotlinJava  
keycloakAuthenticationProvider = keycloakAuthenticationProvider();

https://refactorizando.com/integracion-keycloak-spring-boot/ 7/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando
11. keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new
SimpleAuthorityMapper());
12. auth.authenticationProvider(keycloakAuthenticationProvider);
13. }
14.
15. @Override
16. protected void configure(HttpSecurity http) throws Exception {
17. super.configure(http);
18. http.authorizeRequests()
19. .anyRequest()
20. .permitAll();
21. http.csrf().disable();
22. }
23.
24. @Bean
25. @Override
26. protected SessionAuthenticationStrategy
sessionAuthenticationStrategy() {
27. return new RegisterSessionAuthenticationStrategy(new
SessionRegistryImpl());
28. }
29.
30. @Bean
31. public KeycloakConfigResolver KeycloakConfigResolver() {
32. return new KeycloakSpringBootConfigResolver();
33. }
34. }

@EnableGlobalMethodSecurity: prePostEnable activa las anotaciones pre y post. La


anotación SecuredEnable determina si la anotación @Secured estara actvia.
Jsr250Enabled, nos permitirá usar la anotación @RoleAllowed.

KeycloakCon gResolver: Para cargar el Spring Boot Adapter porporcionado por


Keycloak generamos este bean.

Con gureGlobal: Se encarga de registrar el KeycloakAuthenticationProvider con el


autentication manager.

Con guración de Keycloak en Spring Boot


Para poder conectarnos con el servidor de keycloak que tengamos levantado es necesario
realizar la siguiente con guración en nuestro application.properties o yml que se
encuentra en src/main/resources.

A continuación vamos a de nir la con guración imprescindible que se necesita para que
nuestra aplicación Spring Boot se conecte con Keycloak:
1. keycloak.auth-server-url=http://localhost:8081/auth
2. keycloak.realm=SpringBootExample
3. keycloak.resource=login
4. keycloak.public-client=true

Creación del controlador


A continuación crearemos el controlador de acceso a la aplicación mediante el acceso con
Roles. A excepción del endpoint primero /anonymous, el cual no tendrá acceso por rol,
simplemente por autenticación:
1. @RestController
2. @RequestMapping("/api/v1/access")
3. public class UserController {
4.
5. @RequestMapping(value = "/anonymous", method =
RequestMethod.GET)
Frameworkspublic
 Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 
6. ResponseEntity<String> getAnonymous() {
SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  
7. return ResponseEntity.ok("Hello Anonymous");
8. }

https://refactorizando.com/integracion-keycloak-spring-boot/ 8/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando
9.
10. @RolesAllowed("user")
11. @GetMapping(value = "/user")
12. public ResponseEntity<String> getUser(@RequestHeader String
Authorization) {
13. return ResponseEntity.ok("Hello User");
14. }
15.
16. @RolesAllowed("admin")
17. @RequestMapping(value = "/admin", method = RequestMethod.GET)
18. public ResponseEntity<String> getAdmin(@RequestHeader String
Authorization) {
19. return ResponseEntity.ok("Hello Admin");
20. }
21.
22. @RolesAllowed({ "admin", "user" })
23. @RequestMapping(value = "/all-user", method = RequestMethod.GET)
24. public ResponseEntity<String> getAllUser(@RequestHeader String
Authorization) {
25. return ResponseEntity.ok("Hello All User");
26. }
27. }

Una vez hemos terminado la con guración podemos probar nuestro servicio añadiendo el
token generado en la cabecera como HTTP Header:

--header 'Authorization: bearer <ACCESS_TOKEN>'

Si tu usuario tiene acceso (Roles Allowed), podrá acceder al sistema en otro caso obtendrá
un 403 de Forbidden.

Vamos a probar con unos curl, si pre eres puedes usar postman.

curl -X GET 'http://localhost:8082/api/v1/access/anonymous'


Respuesta:
Autenticación correcta, Hello Anónimo

curl -X GET 'http://localhost:8082/api/v1/access/user' --header 'Authori


zation: bearer <Access-token>'
Respuesta:
Rol permitido, Hello User

Conclusión
En esta entrada de Integración de keycloak con Spring Boot, hemos visto como realizar la
autenticación apoyándonos en Keycloak, y la autorización basada en roles, a través de
Spring Security.

La delegación de la autenticación en un sistema de Identity Access Management como


Keycloak, es de vital importancia cuando se realizar una arquitectura orientada a
microservicios.

Si quieres ver el ejemplo completo puedes verlo en nuestro github, pulsando aquí.
(https://github.com/refactorizando-web/spring-boot-keycloak)

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 9/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

No te olvides de seguirnos en nuestras


redes sociales
(https://www.facebook.com/viajaneando/)Facebook
(https://www.facebook.com/refactorizando) o Twitter
(https://twitter.com/refactorizando)!

Si necesitas más información puedes escribirnos un comentario o un correo


electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!

Tags: access token (https://refactorizando.com/tag/access-token/), identity access management


(https://refactorizando.com/tag/identity-access-management/), jwt (https://refactorizando.com/tag/jwt/), keycloak
(https://refactorizando.com/tag/keycloak/), security (https://refactorizando.com/tag/security/), springsecurity
(https://refactorizando.com/tag/springsecurity/), token (https://refactorizando.com/tag/token/)

Más historias
(https://refactorizando.com/per les-spring-boot/)

FRAMEWORKS (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/)
SPRING (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/SPRING-FRAMEWORK/)
Per les en Spring Boot (https://refactorizando.com/per les-spring-boot/)
 1 día hace Noel Rodríguez Calle (https://refactorizando.com/author/admin/)

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


(https://refactorizando.com/mock-aws-localstack-spring-boot/)
SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

https://refactorizando.com/integracion-keycloak-spring-boot/ 10/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando

FRAMEWORKS (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/) JAVA (HTTPS://REFACTORIZANDO.COM/CATEGORY/LENGUAJES/JAVA/)


PLATAFORMAS (HTTPS://REFACTORIZANDO.COM/CATEGORY/PLATAFORMAS/)
SPRING (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/SPRING-FRAMEWORK/)
Mock AWS con Localstack en Spring Boot (https://refactorizando.com/mock-aws-localstack-spring-boot/)
 3 semanas hace Noel Rodríguez Calle (https://refactorizando.com/author/admin/)

(https://refactorizando.com/base-de-datos-memoria-h2-spring-boot/)

FRAMEWORKS (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/)
HIBERNATE (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/HIBERNATE/)
SPRING (HTTPS://REFACTORIZANDO.COM/CATEGORY/FRAMEWORK/SPRING-FRAMEWORK/)
Base de Datos en memoria H2 con Spring Boot (https://refactorizando.com/base-de-datos-memoria-h2-spring-
boot/)
 4 semanas hace Noel Rodríguez Calle (https://refactorizando.com/author/admin/)

1 pensamiento sobre “Integración de keycloak con


Spring Boot”
Pingback: Arquitectura de Microservicios con Kong API Gateway y Konga - Refactorizando
(https://refactorizando.com/arquitectura-microservicios-kong-konga/)

Deja una respuesta


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

Comentario

Frameworks  Patrones y Arquitectura Plataformas  Base De Datos Lenguajes 


SpringQuarkusMicronautHibernate Kuberneteskafka GraphQLKotlinJava  

Nombre *

https://refactorizando.com/integracion-keycloak-spring-boot/ 11/12
3/9/2021 Integración de keycloak con Spring Boot - Refactorizando
Correo
electrónico *

Web

Guarda mi nombre, correo electrónico y web en este navegador para la próxima vez que comente.

Publicar el comentario

Te pueden interesar
(https://refactorizando.com/per les-spring-boot/) (https://refactorizando.com/tolerations-taints- (https://refactorizando.com/clusterip-vs-
kubernetes/) loadbalancer-vs-nodeport-vs-ingress-en-
kubernetes/)
Frameworks (https://refactorizando.com/category/framework/) Kubernetes Kubernetes
(https://refactorizando.com/category/plataformas/kubernetes/) (https://refactorizando.com/category/plataformas/kubernetes/)
Spring
(https://refactorizando.com/category/framework/spring- Plataformas Plataformas
framework/) (https://refactorizando.com/category/plataformas/) (https://refactorizando.com/category/plataformas/)

Per les en Spring Boot Entender Tolerations y Taints en Kubernetes Cuándo usar ClusterIP Vs LoadBalancer Vs
(https://refactorizando.com/per les-spring- (https://refactorizando.com/tolerations-taints- NodePort Vs ingress en Kubernetes
boot/) kubernetes/) (https://refactorizando.com/clusterip-vs-
 1 día hace Noel Rodríguez Calle  1 semana hace Noel Rodríguez Calle loadbalancer-vs-nodeport-vs-ingress-en-
(https://refactorizando.com/author/admin/) (https://refactorizando.com/author/admin/) kubernetes/)
 2 semanas hace Noel Rodríguez Calle
(https://refactorizando.com/author/admin/)
(https://refactorizando.com/mock-aws-localstack-
Frameworks (https://refactorizando.com/category/framework/) (https://refactorizando.com/base-de-datos-
spring-boot/)
Java (https://refactorizando.com/category/lenguajes/java/) memoria-h2-spring-boot/)
Frameworks (https://refactorizando.com/category/framework/)
Plataformas Hibernate
(https://refactorizando.com/category/plataformas/) (https://refactorizando.com/category/framework/hibernate/)
Spring Spring
(https://refactorizando.com/category/framework/spring- (https://refactorizando.com/category/framework/spring-
framework/) framework/)

Mock AWS con Localstack en Spring Boot Base de Datos en memoria H2 con Spring Boot
(https://refactorizando.com/mock-aws- (https://refactorizando.com/base-de-datos-
localstack-spring-boot/) memoria-h2-spring-boot/)
 3 semanas hace Noel Rodríguez Calle  4 semanas hace Noel Rodríguez Calle
(https://refactorizando.com/author/admin/) (https://refactorizando.com/author/admin/)

Facebook (https://www.facebook.com/refactorizando) Twitter (https://twitter.com/refactorizando)

Instagram (https://www.instagram.com/refactorizando) Email (mailto:refactorizando.web@gmail.com)

Refactorizando Copyright © Todos los derechos reservados.

https://refactorizando.com/integracion-keycloak-spring-boot/ 12/12

También podría gustarte