# Corrections - Timeout & ViewExpiredException ## 🐛 ProblĂšmes identifiĂ©s ### 1. Timeout 30s sur `/api/users/search` ``` Erreur lors du chargement des utilisateurs: The timeout period of 30000ms has been exceeded while executing POST /api/users/search ``` **Cause** : Le backend met trop de temps Ă  rĂ©cupĂ©rer les utilisateurs depuis Keycloak Admin API. **Raisons possibles** : - Keycloak local lent au dĂ©marrage - Beaucoup d'utilisateurs Ă  rĂ©cupĂ©rer - Configuration Admin Client incorrecte (mauvais realm) --- ### 2. ViewExpiredException JSF ``` jakarta.faces.application.ViewExpiredException: View "/pages/user-manager/users/list.xhtml" could not be restored. ``` **Cause** : La vue JSF a expirĂ© pendant l'attente de la rĂ©ponse du backend. **Raisons** : - Timeout trop long (30s) → Session JSF expire avant la fin - Nombre limitĂ© de vues en session (50) - Rechargement de page pendant le chargement --- ## ✅ Solutions appliquĂ©es ### 1ïžâƒŁ Augmentation du timeout REST Client **Fichier** : `lions-user-manager-client-quarkus-primefaces-freya/src/main/resources/application-dev.properties` **Modification** : ```properties # Timeout augmentĂ© pour Ă©viter les erreurs lors des appels Keycloak lents quarkus.rest-client."lions-user-manager-api".read-timeout=90000 ``` **Avant** : 30 secondes (30000ms) - **dĂ©fini dans application.properties** **AprĂšs** : 90 secondes (90000ms) en DEV --- ### 2ïžâƒŁ Correction du realm Admin Client **Fichier** : `lions-user-manager-server-impl-quarkus/src/main/resources/application-dev.properties` **ProblĂšme** : Le backend essayait de s'authentifier sur le realm `lions-user-manager` au lieu de `master`. **Modification** : ```properties # IMPORTANT: L'utilisateur admin se trouve dans le realm "master", pas "lions-user-manager" lions.keycloak.server-url=http://localhost:8180 lions.keycloak.admin-realm=master # ← ChangĂ© de "lions-user-manager" Ă  "master" lions.keycloak.admin-client-id=admin-cli lions.keycloak.admin-username=admin lions.keycloak.admin-password=admin # Timeout augmentĂ© pour Keycloak local (peut ĂȘtre lent au dĂ©marrage) lions.keycloak.timeout-seconds=60 # ← AjoutĂ© ``` --- ### 2ïžâƒŁ.1 Ajout des permissions HTTP en DEV **Fichier** : `lions-user-manager-server-impl-quarkus/src/main/resources/application-dev.properties` **ProblĂšme** : Le backend retournait **403 Forbidden** mĂȘme avec la sĂ©curitĂ© dĂ©sactivĂ©e, car aucune permission HTTP explicite n'Ă©tait dĂ©finie. **Modification** : ```properties # Permissions HTTP - AccĂšs public Ă  tous les endpoints en DEV quarkus.http.auth.permission.public.paths=/api/*,/q/*,/health/*,/metrics,/swagger-ui/*,/openapi quarkus.http.auth.permission.public.policy=permit ``` **Avant** : Backend retournait 403 sur `/api/users/search` **AprĂšs** : Tous les endpoints `/api/*` sont accessibles sans authentification en DEV **VĂ©rification** : ```bash curl -X POST http://localhost:8180/realms/master/protocol/openid-connect/token \ -d "client_id=admin-cli" \ -d "grant_type=password" \ -d "username=admin" \ -d "password=admin" # ✅ Retourne un access_token → Authentification rĂ©ussie ``` --- ### 3ïžâƒŁ AmĂ©lioration de la configuration MyFaces **Fichier** : `lions-user-manager-client-quarkus-primefaces-freya/src/main/resources/application.properties` **Modifications** : ```properties # Nombre de vues en session augmentĂ© quarkus.myfaces.number-of-views-in-session=100 # Avant: 50 quarkus.myfaces.number-of-sequential-views-in-session=20 # Avant: 10 # Timeout client augmentĂ© (2h au lieu de 1h) quarkus.myfaces.client-view-state-timeout=7200000 # Avant: 3600000 # Mapping automatique activĂ© quarkus.myfaces.automatic-extensionless-mapping=true # AjoutĂ© ``` **BĂ©nĂ©fices** : - ✅ Plus de vues conservĂ©es en mĂ©moire (50 → 100) - ✅ Timeout client doublĂ© (1h → 2h) --- ### 3ïžâƒŁ.1 Handler personnalisĂ© ViewExpiredException (NOUVEAU) **Fichiers créés** : - `CustomViewExpiredExceptionHandler.java` - `CustomExceptionHandlerFactory.java` - Configuration dans `faces-config.xml` **StratĂ©gie intelligente** : ```java // Si ViewExpiredException dĂ©tectĂ©e: if (session HTTP/OIDC valide) { // La vue JSF a expirĂ©, mais l'utilisateur est toujours authentifiĂ© → Rediriger vers la page d'origine (ou liste par dĂ©faut) } else { // La session HTTP/OIDC a expirĂ© → Invalider la session → Rediriger vers /logout (Keycloak gĂšre le logout complet) } ``` **BĂ©nĂ©fices** : - ✅ **DĂ©connexion automatique** si la session expire - ✅ **Pas de boucle de redirection** vers pages protĂ©gĂ©es - ✅ **UX amĂ©liorĂ©e** : seulement rafraĂźchir si session valide - ✅ **SĂ©curitĂ©** : force la rĂ©-authentification si nĂ©cessaire --- ## 🚀 Test de la configuration ### VĂ©rifier Keycloak ```bash # Keycloak est accessible curl -I http://localhost:8180 # → HTTP/1.1 302 Found ✅ # Le realm existe curl http://localhost:8180/realms/lions-user-manager # → {"realm":"lions-user-manager",...} ✅ # L'authentification admin fonctionne curl -X POST http://localhost:8180/realms/master/protocol/openid-connect/token \ -d "client_id=admin-cli" -d "grant_type=password" \ -d "username=admin" -d "password=admin" # → {"access_token":"..."} ✅ ``` ### RedĂ©marrer les applications ```bash # Terminal 1 : Backend (redĂ©marrage nĂ©cessaire pour application-dev.properties) cd lions-user-manager/lions-user-manager-server-impl-quarkus # ArrĂȘter avec Ctrl+C puis: mvn quarkus:dev # Terminal 2 : Client (redĂ©marrage nĂ©cessaire pour les nouvelles configs) cd lions-user-manager/lions-user-manager-client-quarkus-primefaces-freya # ArrĂȘter avec Ctrl+C puis: mvn quarkus:dev ``` ### Tester l'interface 1. AccĂ©der Ă  : http://localhost:8082 2. Se connecter avec Keycloak 3. Naviguer vers : `/pages/user-manager/users/list.xhtml` 4. **VĂ©rifier** : La liste des utilisateurs se charge (peut prendre jusqu'Ă  90s) --- ## 📊 RĂ©sumĂ© des timeouts | Composant | Configuration | Avant | AprĂšs | |-----------|--------------|-------|-------| | **REST Client** (read) | `quarkus.rest-client.*.read-timeout` | 30s | 90s | | **Keycloak Admin** | `lions.keycloak.timeout-seconds` | 30s | 60s | | **MyFaces Client State** | `quarkus.myfaces.client-view-state-timeout` | 1h | 2h | | **Session HTTP** | `quarkus.http.session-timeout` | 60min | 60min | --- ## 🔧 Si le problĂšme persiste ### Option 1 : Ajouter un cache cĂŽtĂ© backend Éviter de requĂȘter Keycloak Ă  chaque fois : ```java @ApplicationScoped public class UserCacheService { private final Cache> cache; @Inject UserService userService; public UserCacheService() { cache = Caffeine.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .maximumSize(100) .build(); } public List getCachedUsers(String realm) { return cache.get(realm, k -> userService.getAllUsers(realm, 0, 100).getUsers()); } } ``` --- ### Option 2 : Pagination cĂŽtĂ© frontend Limiter le nombre d'utilisateurs chargĂ©s : ```java // UserListBean.java private static final int DEFAULT_PAGE_SIZE = 20; // Au lieu de 100+ public void loadUsers() { UserSearchCriteriaDTO criteria = UserSearchCriteriaDTO.builder() .realmName(realmName) .page(currentPage) .pageSize(DEFAULT_PAGE_SIZE) // ← Pagination stricte .build(); UserSearchResultDTO result = userServiceClient.searchUsers(criteria); // ... } ``` --- ### Option 3 : Lazy loading Charger les utilisateurs seulement quand nĂ©cessaire : ```xhtml ``` --- ## ✅ Checklist de vĂ©rification - [x] Keycloak accessible sur http://localhost:8180 - [x] Realm `lions-user-manager` existe - [x] Authentification admin `admin/admin` sur realm `master` fonctionne - [x] Timeout REST Client augmentĂ© Ă  90s (DEV) - [x] Keycloak Admin Client configurĂ© sur realm `master` - [x] Timeout Keycloak Admin augmentĂ© Ă  60s - [x] MyFaces : Nombre de vues augmentĂ© (100) - [x] MyFaces : Timeout client augmentĂ© (2h) - [x] Redirection ViewExpired configurĂ©e - [x] **Permissions HTTP configurĂ©es en DEV (corrige le 403 Forbidden)** --- ## 🎯 RĂ©sultat attendu AprĂšs redĂ©marrage : 1. ✅ Pas de timeout 30s 2. ✅ Chargement rĂ©ussi (peut prendre 10-60s selon le nombre d'utilisateurs) 3. ✅ Pas de ViewExpiredException 4. ✅ Liste des utilisateurs affichĂ©e --- **Date** : 2025-12-25 **Version** : 1.0.0 **Statut** : ✅ CORRECTIONS APPLIQUÉES - RedĂ©marrage requis