From a87dca37d8ad8a029c4bb1ef7ca3c1ecfb6b30f5 Mon Sep 17 00:00:00 2001 From: lionsdev Date: Fri, 5 Dec 2025 16:23:56 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Impl=C3=A9mentation=20s=C3=A9curit?= =?UTF-8?q?=C3=A9=20@RolesAllowed=20et=20corrections=20diverses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout DevSecurityContextProducer pour @RolesAllowed en dev - Correction UserSearchCriteriaDTO (searchTerm au lieu de searchText) - Mise à jour version quarkus-primefaces à 3.15.1 - Corrections expressions EL dans composants audit et role-assignment --- .../user/manager/config/JacksonConfig.java | 20 +++++ .../security/DevSecurityContextProducer.java | 80 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/dev/lions/user/manager/config/JacksonConfig.java create mode 100644 src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java diff --git a/src/main/java/dev/lions/user/manager/config/JacksonConfig.java b/src/main/java/dev/lions/user/manager/config/JacksonConfig.java new file mode 100644 index 0000000..b59e643 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/config/JacksonConfig.java @@ -0,0 +1,20 @@ +package dev.lions.user.manager.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.quarkus.jackson.ObjectMapperCustomizer; +import jakarta.inject.Singleton; + +/** + * Configuration Jackson pour ignorer les propriétés inconnues + * Nécessaire pour la compatibilité avec les versions récentes de Keycloak + */ +@Singleton +public class JacksonConfig implements ObjectMapperCustomizer { + + @Override + public void customize(ObjectMapper objectMapper) { + // Ignorer les propriétés inconnues pour compatibilité Keycloak + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } +} diff --git a/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java b/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java new file mode 100644 index 0000000..a38e223 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java @@ -0,0 +1,80 @@ +package dev.lions.user.manager.security; + +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.SecurityContext; +import jakarta.ws.rs.ext.Provider; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import java.security.Principal; + +/** + * Filtre JAX-RS pour remplacer le SecurityContext en mode développement + * En dev, remplace le SecurityContext par un mock qui autorise tous les rôles + * En prod, laisse le SecurityContext réel de Quarkus + */ +@Provider +@Priority(Priorities.AUTHENTICATION - 1) // S'exécute avant l'authentification +public class DevSecurityContextProducer implements ContainerRequestFilter { + + private static final Logger LOG = Logger.getLogger(DevSecurityContextProducer.class); + + @Inject + @ConfigProperty(name = "quarkus.profile", defaultValue = "prod") + String profile; + + @Override + public void filter(ContainerRequestContext requestContext) { + // En dev, remplacer le SecurityContext par un mock + if ("dev".equals(profile) || "development".equals(profile)) { + LOG.debug("Mode dev: remplacement du SecurityContext par un mock avec tous les rôles"); + SecurityContext original = requestContext.getSecurityContext(); + requestContext.setSecurityContext(new DevSecurityContext(original)); + } + } + + /** + * SecurityContext mock pour le mode développement + * Simule un utilisateur avec tous les rôles nécessaires + */ + private static class DevSecurityContext implements SecurityContext { + + private final SecurityContext original; + private final Principal principal = new Principal() { + @Override + public String getName() { + return "dev-user"; + } + }; + + public DevSecurityContext(SecurityContext original) { + this.original = original; + } + + @Override + public Principal getUserPrincipal() { + return principal; + } + + @Override + public boolean isUserInRole(String role) { + // En dev, autoriser tous les rôles + return true; + } + + @Override + public boolean isSecure() { + return original != null ? original.isSecure() : false; + } + + @Override + public String getAuthenticationScheme() { + return "DEV"; + } + } +} +