feat(lum): KeycloakRealmSetupService + rôles RBAC UnionFlow + Jacoco 100%

- Ajoute KeycloakRealmSetupService : auto-initialisation des rôles realm
  (admin, user_manager, user_viewer, role_manager...) et assignation du rôle
  user_manager au service account unionflow-server au démarrage (idempotent,
  retries, thread séparé pour ne pas bloquer le démarrage)
  → Corrige le 403 sur resetPassword / changement de mot de passe premier login

- UserResource : étend les @RolesAllowed avec ADMIN/SUPER_ADMIN/USER pour
  permettre aux appels inter-services unionflow-server d'accéder aux endpoints
  sans être bloqués par le RBAC LUM ; corrige sendVerificationEmail (retourne Response)

- application-dev.properties : service-accounts.user-manager-clients=unionflow-server
- application-prod.properties : client-id, credentials.secret, token.audience, auto-setup
- application-test.properties : H2 in-memory (plus besoin de Docker pour les tests)
- pom.xml : H2 scope test, Jacoco 100% enforcement (exclusions MapStruct/repos/setup),
  annotation processors MapStruct+Lombok explicites
- .gitignore + .env ajouté (.env exclu du commit)
- script/docker/.env.example : variables KEYCLOAK_ADMIN_USERNAME/PASSWORD documentées
This commit is contained in:
dahoud
2026-04-12 15:04:23 +00:00
parent 2ed890803c
commit 8ab1513bf5
35 changed files with 5594 additions and 19 deletions

View File

@@ -16,27 +16,39 @@ quarkus.http.cors.origins=http://localhost:3000,http://localhost:8080,http://loc
# OIDC Configuration DEV
# ============================================
quarkus.oidc.enabled=true
# realm lions-user-manager : cohérent avec le client web ET les appels inter-services
# (unionflow-server doit aussi utiliser lions-user-manager realm pour appeler LUM)
quarkus.oidc.auth-server-url=http://localhost:8180/realms/lions-user-manager
quarkus.oidc.client-id=lions-user-manager-server
quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET:V3nP8kRzW5yX2mTqBcE7aJdFuHsL4gYo}
quarkus.oidc.token.issuer=http://localhost:8180/realms/lions-user-manager
# Audience : les tokens doivent contenir lions-user-manager-server dans le claim aud
quarkus.oidc.token.audience=lions-user-manager-server
quarkus.oidc.tls.verification=none
# ============================================
# Keycloak Admin Client Configuration DEV
# ============================================
lions.keycloak.server-url=http://localhost:8180
lions.keycloak.admin-username=admin
lions.keycloak.admin-password=admin
lions.keycloak.admin-username=${KEYCLOAK_ADMIN_USERNAME:admin}
lions.keycloak.admin-password=${KEYCLOAK_ADMIN_PASSWORD:admin}
lions.keycloak.connection-pool-size=5
lions.keycloak.timeout-seconds=30
lions.keycloak.authorized-realms=lions-user-manager,master,btpxpress,test-realm
# Realms autorisés — uniquement ceux qui existent localement
# master est exclu par le code (skip explicite), btpxpress/test-realm n'existent pas en dev
lions.keycloak.authorized-realms=unionflow,lions-user-manager
# Clients dont le service account doit recevoir le rôle user_manager au démarrage
lions.keycloak.service-accounts.user-manager-clients=unionflow-server
# Quarkus-managed Keycloak Admin Client DEV
quarkus.keycloak.admin-client.server-url=http://localhost:8180
quarkus.keycloak.admin-client.realm=master
quarkus.keycloak.admin-client.client-id=admin-cli
quarkus.keycloak.admin-client.grant-type=PASSWORD
quarkus.keycloak.admin-client.username=admin
quarkus.keycloak.admin-client.password=admin
quarkus.keycloak.admin-client.username=${KEYCLOAK_ADMIN_USERNAME:admin}
# Valeur par défaut "admin" pour l'environnement de développement local
quarkus.keycloak.admin-client.password=${KEYCLOAK_ADMIN_PASSWORD:admin}
# ============================================
# Audit Configuration DEV

View File

@@ -23,7 +23,11 @@ quarkus.http.proxy.enable-forwarded-prefix=true
# ============================================
quarkus.oidc.enabled=true
quarkus.oidc.auth-server-url=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/lions-user-manager}
quarkus.oidc.client-id=${KEYCLOAK_CLIENT_ID:lions-user-manager-server}
quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET:kUIgIVf65f5NfRLRfbtG8jDhMvMpL0m0}
quarkus.oidc.token.issuer=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/lions-user-manager}
# Audience : les tokens doivent contenir lions-user-manager-server dans le claim aud
quarkus.oidc.token.audience=lions-user-manager-server
quarkus.oidc.tls.verification=required
# ============================================
@@ -35,6 +39,9 @@ lions.keycloak.admin-password=${KEYCLOAK_ADMIN_PASSWORD:KeycloakAdmin2025!}
lions.keycloak.connection-pool-size=20
lions.keycloak.timeout-seconds=60
lions.keycloak.authorized-realms=${KEYCLOAK_AUTHORIZED_REALMS:lions-user-manager,btpxpress,master,unionflow}
# En prod, l'auto-setup est désactivé par défaut (géré via LIONS_KEYCLOAK_AUTO_SETUP=true si désiré)
lions.keycloak.auto-setup.enabled=${LIONS_KEYCLOAK_AUTO_SETUP:false}
lions.keycloak.service-accounts.user-manager-clients=${LIONS_SERVICE_ACCOUNTS_USER_MANAGER:}
# Quarkus-managed Keycloak Admin Client PROD
quarkus.keycloak.admin-client.server-url=${KEYCLOAK_SERVER_URL:https://security.lions.dev}

View File

@@ -25,13 +25,21 @@ quarkus.http.cors.headers=*
quarkus.oidc.application-type=service
quarkus.oidc.discovery-enabled=true
quarkus.oidc.roles.role-claim-path=realm_access/roles
quarkus.oidc.token.audience=account
# Pas de vérification d'audience stricte (surchargé par application-dev.properties)
# quarkus.oidc.token.audience=account
# ============================================
# Keycloak Admin Client (COMMUNE)
# ============================================
lions.keycloak.admin-realm=master
lions.keycloak.admin-client-id=admin-cli
# Auto-setup des rôles au démarrage (désactiver en prod via env var LIONS_KEYCLOAK_AUTO_SETUP=false)
lions.keycloak.auto-setup.enabled=${LIONS_KEYCLOAK_AUTO_SETUP:true}
# Retry si Keycloak n'est pas prêt au démarrage (race condition docker/k8s)
lions.keycloak.auto-setup.retry-max=${LIONS_KEYCLOAK_SETUP_RETRY_MAX:5}
lions.keycloak.auto-setup.retry-delay-seconds=${LIONS_KEYCLOAK_SETUP_RETRY_DELAY:5}
# Clients dont le service account doit recevoir le rôle user_manager (surchargé par profil)
lions.keycloak.service-accounts.user-manager-clients=${LIONS_SERVICE_ACCOUNTS_USER_MANAGER:}
# Quarkus-managed Keycloak Admin Client (uses Quarkus ObjectMapper with fail-on-unknown-properties=false)
quarkus.keycloak.admin-client.realm=${lions.keycloak.admin-realm}