From 86d0dc51b7bef715fd24ccc2d6b9aa7b533add81 Mon Sep 17 00:00:00 2001
From: dahoud <41957584+DahoudG@users.noreply.github.com>
Date: Tue, 21 Apr 2026 12:45:44 +0000
Subject: [PATCH] =?UTF-8?q?fix(keycloak):=20g=C3=A9rer=20409=20User=20Conf?=
=?UTF-8?q?lict=20+=20bump=20Lombok=20+=20release=2021=20explicite?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- UserServiceImpl.createUser : capture HTTP 409 et récupère l'utilisateur
existant (searchByEmail/searchByUsername) au lieu de throw brutal
- usernameExists : utilise searchByUsername(exact=true) au lieu de search(query)
pour match exact sans ambiguïté
- pom.xml : 21 explicite sur maven-compiler-plugin
- Lombok 1.18.34 → 1.18.36
Co-Authored-By: Claude Opus 4.7 (1M context)
---
pom.xml | 3 ++-
.../manager/service/impl/UserServiceImpl.java | 21 +++++++++++++++++--
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/pom.xml b/pom.xml
index ab3e1fd..c515dfb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -187,6 +187,7 @@
org.apache.maven.plugins
maven-compiler-plugin
+ 21
org.mapstruct
@@ -196,7 +197,7 @@
org.projectlombok
lombok
- 1.18.34
+ 1.18.36
org.projectlombok
diff --git a/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java b/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java
index 6362d0a..ac19c09 100644
--- a/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java
+++ b/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java
@@ -215,8 +215,25 @@ public class UserServiceImpl implements UserService {
UsersResource usersResource = keycloakAdminClient.getUsers(realmName);
var response = usersResource.create(userRep);
+ if (response.getStatus() == 409) {
+ // Utilisateur déjà existant — le récupérer par email ou username
+ log.warn("Utilisateur {} déjà existant dans Keycloak (409), récupération...", user.getUsername());
+ if (user.getEmail() != null) {
+ List existing = usersResource.searchByEmail(user.getEmail(), true);
+ if (!existing.isEmpty()) {
+ log.info("Utilisateur récupéré par email: {}", user.getEmail());
+ return UserMapper.toDTO(existing.get(0), realmName);
+ }
+ }
+ List existing = usersResource.searchByUsername(user.getUsername(), true);
+ if (!existing.isEmpty()) {
+ log.info("Utilisateur récupéré par username: {}", user.getUsername());
+ return UserMapper.toDTO(existing.get(0), realmName);
+ }
+ throw new RuntimeException("Utilisateur en conflit mais introuvable: " + user.getUsername());
+ }
if (response.getStatus() != 201) {
- throw new RuntimeException("Échec de la création de l'utilisateur: " + response.getStatusInfo());
+ throw new RuntimeException("Échec de la création de l'utilisateur (HTTP " + response.getStatus() + " " + response.getStatusInfo().getReasonPhrase() + ")");
}
// Récupérer l'ID de l'utilisateur créé
@@ -465,7 +482,7 @@ public class UserServiceImpl implements UserService {
public boolean usernameExists(@NotBlank String username, @NotBlank String realmName) {
try {
List users = keycloakAdminClient.getUsers(realmName)
- .search(username, 0, 1, true);
+ .searchByUsername(username, true);
return !users.isEmpty();
} catch (Exception e) {
log.error("Erreur lors de la vérification de l'existence du username {}", username, e);