# Lions User Manager Module de gestion centralisée des utilisateurs via Keycloak Admin REST API. ## 🎯 Objectif Fournir une gestion complète des utilisateurs Keycloak via une interface PrimeFaces Freya moderne et une API REST sécurisée, en respectant strictement les contraintes suivantes: - ✅ **AUCUNE écriture directe dans la DB Keycloak** (utilisation exclusive de l'Admin REST API) - ✅ **Architecture multi-modules Maven** (API, Impl, Client) - ✅ **Authentification OIDC via Keycloak** - ✅ **Délégation multi-realm** (superadmin global, admin de realm) - ✅ **Audit complet** (qui, quoi, quand, IP, succès/échec) - ✅ **Tests avec Testcontainers** (80% minimum de couverture) - ✅ **Déploiement Kubernetes via Helm** ## 🏗️ Architecture ``` lions-user-manager/ ├── lions-user-manager-server-api # Contrats (DTOs, interfaces, enums) ├── lions-user-manager-server-impl-quarkus # Implémentation (Resources, Services, Keycloak Client) └── lions-user-manager-client-quarkus-primefaces-freya # UI (PrimeFaces, Beans JSF, REST Clients) ``` ### Modules #### 1. **server-api** (JAR) Contrats purs sans dépendances lourdes: - DTOs avec validation Bean - Interfaces de services - Enums métiers - Constantes de validation **Package**: `dev.lions.user.manager.server.api` #### 2. **server-impl-quarkus** (JAR) Implémentation serveur Quarkus: - Resources REST JAX-RS (`/api/users`, `/api/roles`, `/api/audit`) - Services métier (implémentations des interfaces) - **KeycloakAdminClient** (interface + impl) - Configuration sécurité OIDC - Entités JPA pour audit local (optionnel) **Package**: `dev.lions.user.manager.server` #### 3. **client-quarkus-primefaces-freya** (JAR) Client web PrimeFaces Freya: - Services REST Client (MicroProfile Rest Client) - Beans JSF (@Named, @SessionScoped/@RequestScoped) - Pages XHTML PrimeFaces - Filtres de sécurité - Converters & Validators JSF **Package**: `dev.lions.user.manager.client` ## 🚀 Stack Technique | Technologie | Version | |------------|---------| | Java | 17+ | | Quarkus | 3.15.1 | | PrimeFaces | 14.0.5 | | Quarkus PrimeFaces | 3.13.3 | | Keycloak Admin Client | 23.0.3 | | PostgreSQL (optionnel) | 15+ | | Lombok | 1.18.30 | | MapStruct | 1.5.5.Final | | Testcontainers | 1.19.3 | ## 📂 Structure du Projet ### Module server-api ``` lions-user-manager-server-api/ └── src/main/java/dev/lions/user/manager/server/api/ ├── dto/ │ ├── base/ │ │ └── BaseDTO.java # DTO de base avec UUID id │ ├── user/ │ │ ├── UserDTO.java # DTO utilisateur complet │ │ ├── UserSearchCriteria.java # Critères de recherche │ │ └── UserSearchResultDTO.java # Résultat de recherche paginé │ ├── role/ │ │ ├── RoleDTO.java # DTO rôle │ │ └── RoleAssignmentDTO.java # Assignation rôle → utilisateur │ └── audit/ │ └── AuditLogDTO.java # Log d'audit ├── enums/ │ ├── user/ │ │ └── StatutUser.java # ACTIF, INACTIF, SUSPENDU, etc. │ └── role/ │ └── TypeRole.java # REALM_ROLE, CLIENT_ROLE ├── service/ │ ├── UserService.java # Interface CRUD utilisateurs │ ├── RoleService.java # Interface gestion rôles │ ├── AuditService.java # Interface consultation audit │ └── SyncService.java # Interface synchronisation └── validation/ └── ValidationConstants.java # Constantes de validation ``` ### Module server-impl-quarkus ``` lions-user-manager-server-impl-quarkus/ └── src/main/java/dev/lions/user/manager/server/ ├── resource/ │ ├── UserResource.java # GET/POST/PUT/DELETE /api/users │ ├── RoleResource.java # GET/POST/DELETE /api/roles │ ├── AuditResource.java # GET /api/audit │ └── HealthResource.java # /health/ready, /health/live ├── service/ │ ├── UserServiceImpl.java # Impl UserService │ ├── RoleServiceImpl.java # Impl RoleService │ ├── AuditServiceImpl.java # Impl AuditService │ └── SyncServiceImpl.java # Impl SyncService ├── client/ │ ├── KeycloakAdminClient.java # Interface centralisée Keycloak Admin API │ └── KeycloakAdminClientImpl.java # Implémentation avec retry/circuit breaker ├── security/ │ ├── KeycloakService.java # Gestion tokens service account │ └── SecurityConfig.java # Configuration sécurité Quarkus ├── entity/ # Optionnel: audit local │ └── AuditLog.java # Entité JPA audit └── repository/ # Optionnel: audit local └── AuditLogRepository.java # Repository Panache ``` ### Module client-quarkus-primefaces-freya ``` lions-user-manager-client-quarkus-primefaces-freya/ └── src/main/ ├── java/dev/lions/user/manager/client/ │ ├── service/ │ │ ├── UserService.java # REST Client (@RegisterRestClient) │ │ ├── RoleService.java # REST Client │ │ └── AuditService.java # REST Client │ ├── dto/ │ │ ├── UserDTO.java # DTO client simplifié │ │ ├── RoleDTO.java # DTO rôle client │ │ └── AuditLogDTO.java # DTO audit client │ ├── view/ │ │ ├── UserRechercheBean.java # Bean recherche utilisateurs │ │ ├── UserListeBean.java # Bean liste utilisateurs │ │ ├── UserProfilBean.java # Bean profil utilisateur │ │ ├── RoleGestionBean.java # Bean gestion rôles │ │ └── AuditConsultationBean.java # Bean consultation audit │ └── security/ │ ├── JwtTokenManager.java # Gestion tokens JWT │ ├── AuthenticationFilter.java # Filtre authentification │ └── PermissionChecker.java # Vérification permissions └── resources/ ├── application.properties # Configuration client └── META-INF/resources/pages/ ├── users-search.xhtml # Page recherche utilisateurs ├── users-list.xhtml # Page liste utilisateurs ├── user-profile.xhtml # Page profil utilisateur ├── roles-management.xhtml # Page gestion rôles └── audit-logs.xhtml # Page consultation audit ``` ## ⚙️ Configuration ### application.properties (server-impl) ```properties # Application quarkus.application.name=Lions User Manager Server quarkus.application.version=1.0.0 # HTTP quarkus.http.port=8080 quarkus.http.host=0.0.0.0 # CORS quarkus.http.cors=true quarkus.http.cors.origins=http://localhost:8081 quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS # OIDC quarkus.oidc.auth-server-url=https://security.lions.dev/realms/btpxpress quarkus.oidc.client-id=lions-user-manager-server quarkus.oidc.credentials.secret=${OIDC_CLIENT_SECRET} quarkus.oidc.application-type=service # Keycloak Admin Client lions.user.manager.keycloak.server-url=${KEYCLOAK_SERVER_URL:http://localhost:8180} lions.user.manager.keycloak.realm=${KEYCLOAK_REALM:master} lions.user.manager.keycloak.client-id=${KEYCLOAK_CLIENT_ID:lions-user-manager} lions.user.manager.keycloak.client-secret=${KEYCLOAK_CLIENT_SECRET} lions.user.manager.keycloak.connection-timeout=5000 lions.user.manager.keycloak.read-timeout=30000 # Feature Toggles lions.user.manager.keycloak.write.enabled=true # Database (optionnel pour audit) %prod.quarkus.datasource.db-kind=postgresql %prod.quarkus.datasource.jdbc.url=${DATABASE_URL} %prod.quarkus.datasource.username=${DATABASE_USER} %prod.quarkus.datasource.password=${DATABASE_PASSWORD} %prod.quarkus.hibernate-orm.database.generation=none %prod.quarkus.flyway.migrate-at-start=true # OpenAPI quarkus.smallrye-openapi.path=/q/openapi quarkus.swagger-ui.always-include=true quarkus.swagger-ui.path=/q/swagger-ui # Health quarkus.smallrye-health.root-path=/health # Metrics quarkus.micrometer.export.prometheus.enabled=true quarkus.micrometer.export.prometheus.path=/metrics # Logging quarkus.log.level=INFO quarkus.log.category."dev.lions.user.manager".level=DEBUG ``` ### application.properties (client) ```properties # Application quarkus.application.name=Lions User Manager Client quarkus.application.version=1.0.0 # HTTP quarkus.http.port=8081 quarkus.http.host=0.0.0.0 # OIDC quarkus.oidc.auth-server-url=https://security.lions.dev/realms/btpxpress quarkus.oidc.client-id=lions-user-manager-client quarkus.oidc.credentials.secret=${OIDC_CLIENT_SECRET} quarkus.oidc.application-type=web-app quarkus.oidc.authentication.redirect-path=/ quarkus.oidc.authentication.restore-path-after-redirect=true # PrimeFaces primefaces.THEME=freya primefaces.FONT_AWESOME=true primefaces.CLIENT_SIDE_VALIDATION=true # REST Client lions.user.manager.backend.url=${BACKEND_URL:http://localhost:8080} quarkus.rest-client."lions-user-manager-api".url=${lions.user.manager.backend.url} quarkus.rest-client."lions-user-manager-api".scope=jakarta.inject.Singleton quarkus.rest-client."lions-user-manager-api".connect-timeout=5000 quarkus.rest-client."lions-user-manager-api".read-timeout=30000 # Logging quarkus.log.level=INFO quarkus.log.category."dev.lions.user.manager.client".level=DEBUG ``` ## 🔑 Provisioning Keycloak ### Script de création du client service account Voir `scripts/kcadm-provision.sh`: ```bash #!/bin/bash # Configuration KEYCLOAK_URL="${KEYCLOAK_URL:-http://localhost:8180}" ADMIN_USER="${ADMIN_USER:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-admin}" REALM="${REALM:-master}" CLIENT_ID="lions-user-manager" # Login admin kcadm.sh config credentials --server "$KEYCLOAK_URL" \\ --realm master --user "$ADMIN_USER" --password "$ADMIN_PASSWORD" # Créer le client service account kcadm.sh create clients -r "$REALM" -f - <