diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0976ad5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ +# ============================================ +# Quarkus JSF Frontend .gitignore +# ============================================ + +# Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +# Quarkus +.quarkus/ +quarkus.log + +# IDE +.idea/ +*.iml +*.ipr +*.iws +.vscode/ +.classpath +.project +.settings/ +.factorypath +.apt_generated/ +.apt_generated_tests/ + +# Eclipse +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.loadpath +.recommenders + +# IntelliJ +out/ +.idea_modules/ + +# Logs +*.log +*.log.* +logs/ + +# OS +.DS_Store +Thumbs.db +*.pid + +# Java +*.class +*.jar +!.mvn/wrapper/maven-wrapper.jar +*.war +*.ear +hs_err_pid* + +# JSF/Faces specific +**/META-INF/resources/.faces-config.xml.jsfdia +**/javax.faces.resource/ + +# PrimeFaces cache +**/primefaces_resource_cache/ + +# Node modules (if using npm/webpack) +node_modules/ +npm-debug.log +yarn-error.log +package-lock.json +yarn.lock + +# Static resources compiled +src/main/resources/META-INF/resources/dist/ +src/main/resources/META-INF/resources/assets/vendor/ + +# Application secrets +*.jks +*.p12 +*.pem +*.key +*-secret.properties +application-local.properties +application-dev-override.properties + +# Docker +.dockerignore +docker-compose.override.yml + +# Database +*.db +*.sqlite +*.h2.db + +# Test +test-output/ +.gradle/ +build/ + +# Temporary +.tmp/ +temp/ diff --git a/pom.xml b/pom.xml index 79e1229..ebd0dee 100644 --- a/pom.xml +++ b/pom.xml @@ -149,6 +149,9 @@ org.apache.maven.plugins maven-compiler-plugin + + 21 + diff --git a/src/main/java/dev/lions/user/manager/client/view/AuditConsultationBean.java b/src/main/java/dev/lions/user/manager/client/view/AuditConsultationBean.java index dcc9702..b883791 100644 --- a/src/main/java/dev/lions/user/manager/client/view/AuditConsultationBean.java +++ b/src/main/java/dev/lions/user/manager/client/view/AuditConsultationBean.java @@ -18,10 +18,8 @@ import org.eclipse.microprofile.rest.client.inject.RestClient; import java.io.OutputStream; import java.io.Serializable; import java.time.LocalDateTime; -import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.logging.Logger; @@ -47,8 +45,8 @@ public class AuditConsultationBean implements Serializable { private AuditLogDTO selectedLog; private String acteurUsername; - private Date dateDebut; - private Date dateFin; + private LocalDateTime dateDebut; + private LocalDateTime dateFin; private TypeActionAudit selectedTypeAction; private String ressourceType; private Boolean succes; @@ -212,9 +210,23 @@ public class AuditConsultationBean implements Serializable { } } - private String toIsoString(Date date) { - if (date == null) return null; - LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + public void loadLogsByActeur(String acteur) { + try { + List result = auditServiceClient.getLogsByActor(acteur, 100); + auditLogs = result != null ? result : new ArrayList<>(); + totalRecords = auditLogs.size(); + } catch (Exception e) { + LOGGER.severe("Erreur lors du chargement des logs par acteur: " + e.getMessage()); + addErrorMessage("Erreur lors du chargement : " + e.getMessage()); + } + } + + public void loadLogsByRealm(String realmName) { + LOGGER.warning("loadLogsByRealm non supporté côté serveur pour le realm : " + realmName); + } + + private String toIsoString(LocalDateTime ldt) { + if (ldt == null) return null; return ldt.format(DATE_FORMATTER); } diff --git a/src/main/java/dev/lions/user/manager/client/view/UserProfilBean.java b/src/main/java/dev/lions/user/manager/client/view/UserProfilBean.java index a89f15f..9889663 100644 --- a/src/main/java/dev/lions/user/manager/client/view/UserProfilBean.java +++ b/src/main/java/dev/lions/user/manager/client/view/UserProfilBean.java @@ -192,6 +192,34 @@ public class UserProfilBean implements Serializable { } } + /** + * Obtenir les initiales de l'utilisateur pour l'avatar + */ + public String getUserInitials() { + if (user == null) return "?"; + String p = (user.getPrenom() != null && !user.getPrenom().isEmpty()) + ? user.getPrenom().substring(0, 1) : ""; + String n = (user.getNom() != null && !user.getNom().isEmpty()) + ? user.getNom().substring(0, 1) : ""; + String initials = (p + n).toUpperCase(); + return initials.isEmpty() ? "?" : initials; + } + + /** + * Obtenir le nom du rôle principal (libellé lisible) + */ + public String getPrimaryRoleName() { + if (user == null || user.getRealmRoles() == null || user.getRealmRoles().isEmpty()) { + return "Utilisateur"; + } + java.util.List roles = user.getRealmRoles(); + if (roles.contains("admin")) return "Administrateur"; + if (roles.contains("user_manager")) return "Gestionnaire"; + if (roles.contains("user_viewer")) return "Consultant"; + if (roles.contains("auditor")) return "Auditeur"; + return roles.get(0); + } + // Méthodes compatibles avec user-actions.xhtml (qui passe l'ID en paramètre) public void activateUser(String userId) { diff --git a/src/main/java/dev/lions/user/manager/client/view/UserSessionBean.java b/src/main/java/dev/lions/user/manager/client/view/UserSessionBean.java index 96a4155..4c8732d 100644 --- a/src/main/java/dev/lions/user/manager/client/view/UserSessionBean.java +++ b/src/main/java/dev/lions/user/manager/client/view/UserSessionBean.java @@ -341,12 +341,9 @@ public class UserSessionBean implements Serializable { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); - // Invalider la session HTTP locale - externalContext.invalidateSession(); - - // Rediriger vers l'endpoint de logout OIDC de Quarkus - // Quarkus gère la déconnexion Keycloak (end_session_endpoint) + redirection - // post-logout + // NE PAS invalider la session ici — Quarkus OIDC a besoin des tokens + // (stockés en session) pour construire l'URL end_session_endpoint de Keycloak + // avec id_token_hint. La session sera invalidée par Quarkus après le logout. String contextPath = externalContext.getRequestContextPath(); externalContext.redirect(contextPath + "/auth/logout"); facesContext.responseComplete(); @@ -354,7 +351,6 @@ public class UserSessionBean implements Serializable { return null; } catch (Exception e) { LOGGER.severe("Erreur lors de la déconnexion: " + e.getMessage()); - // En cas d'erreur, rediriger vers la page d'accueil return "/?faces-redirect=true"; } } diff --git a/src/main/resources/META-INF/resources/index.html b/src/main/resources/META-INF/resources/index.html index c85452d..d0135e0 100644 --- a/src/main/resources/META-INF/resources/index.html +++ b/src/main/resources/META-INF/resources/index.html @@ -4,977 +4,310 @@ Lions User Manager - Plateforme de Gestion IAM Centralisée + - - - - - - - + + + + + + - - - -
-
- -
- -
- Votre session a expiré pour des raisons de sécurité. Veuillez vous reconnecter pour accéder à la plateforme. -
+ + + + +
+
+ + +
+ + Plateforme IAM Centralisée +
-
-
- - Plateforme IAM Centralisée -
+

+ Gérez vos utilisateurs Keycloak
en toute simplicité +

+

+ Une interface moderne et intuitive pour administrer vos identités, rôles et permissions à travers tous vos royaumes Keycloak. +

-

Gérez vos utilisateurs Keycloak en toute simplicité

+ + -

- Une interface moderne et intuitive pour administrer vos identités, rôles et permissions à travers tous vos royaumes Keycloak. Sécurisé, performant, professionnel. -

- - +
-
+ - -
-
-
-
0
-
Utilisateurs gérés
+ +
+
+
+
10K+
+
Utilisateurs gérés
-
-
0
-
Royaumes actifs
+
+
50+
+
Royaumes actifs
-
-
99.9%
-
Disponibilité
+
+
99.9%
+
Disponibilité
-
-
0
-
Support 24/7
+
+
24/7
+
Supervision
-
+ - -
-
- Fonctionnalités Métier -

Tout ce dont vous avez besoin pour gérer vos identités

-

Une suite complète d'outils pour simplifier l'administration de votre infrastructure IAM.

+ +
+
+
+ + Fonctionnalités Métier + +
+

Tout pour gérer vos identités

+

+ Une suite complète d'outils pour simplifier l'administration de votre infrastructure IAM. +

-
+
-
-
- +
+
+
+ +
+

Gestion des utilisateurs

+

+ Créez, modifiez et supprimez des utilisateurs. Recherche avancée et filtrage en temps réel. +

+
    +
  • Import/Export CSV massif
  • +
  • Recherche multi-critères
  • +
  • Modification par lot
  • +
-

Gestion des utilisateurs

-

- Créez, modifiez et supprimez des utilisateurs en quelques clics. Interface intuitive avec recherche avancée et filtrage en temps réel. -

-
    -
  • Import/Export CSV massif
  • -
  • Recherche multi-critères
  • -
  • Modification par lot
  • -
-
-
- +
+
+
+ +
+

Attribution des rôles

+

+ Permissions granulaires avec un système RBAC flexible et sécurisé. +

+
    +
  • Gestion RBAC complète
  • +
  • Hiérarchie de rôles
  • +
  • Permissions dynamiques
  • +
-

Attribution des rôles

-

- Gérez les permissions de manière granulaire avec un système de rôles flexible et sécurisé conforme aux standards RBAC. -

-
    -
  • Gestion RBAC complète
  • -
  • Hiérarchie de rôles
  • -
  • Permissions dynamiques
  • -
-
-
- +
+
+
+ +
+

Audit & Analytics

+

+ Tableaux de bord interactifs et rapports détaillés en temps réel. +

+
    +
  • Logs d'authentification
  • +
  • Rapports personnalisés
  • +
  • Alertes de sécurité
  • +
-

Audit & Analytics

-

- Suivez l'activité de vos utilisateurs avec des tableaux de bord interactifs et des rapports détaillés en temps réel. -

-
    -
  • Logs d'authentification
  • -
  • Rapports personnalisés
  • -
  • Alertes de sécurité
  • -
-
-
- +
+
+
+ +
+

Synchronisation

+

+ Intégration transparente via API RESTful sécurisée et webhooks. +

+
    +
  • API REST complète
  • +
  • Webhooks événementiels
  • +
  • Connecteurs pré-configurés
  • +
-

Synchronisation

-

- Intégration transparente avec vos systèmes existants via API RESTful sécurisée et webhooks en temps réel. -

-
    -
  • API REST complète
  • -
  • Webhooks événementiels
  • -
  • Connecteurs pré-configurés
  • -
-
-
- +
+
+
+ +
+

Sécurité avancée

+

+ Protection multi-niveaux avec MFA et audit de sécurité complet. +

+
    +
  • MFA/2FA obligatoire
  • +
  • Chiffrement end-to-end
  • +
  • Audit de conformité
  • +
-

Sécurité avancée

-

- Protection multi-niveaux avec chiffrement end-to-end, authentification multi-facteurs et audit de sécurité complet. -

-
    -
  • MFA/2FA obligatoire
  • -
  • Chiffrement AES-256
  • -
  • SOC 2 Type II conforme
  • -
-
-
- +
+
+
+ +
+

Multi-tenant

+

+ Gérez plusieurs organisations depuis une seule interface. +

+
    +
  • Isolation par royaume
  • +
  • Personnalisation par org
  • +
  • Délégation d'administration
  • +
-

Multi-tenant

-

- Gérez plusieurs organisations et royaumes depuis une seule interface avec isolation complète des données. -

-
    -
  • Isolation par royaume
  • -
  • Personnalisation par org
  • -
  • Délégation d'administration
  • -
-
+ - -
-
-

Prêt à transformer votre gestion IAM ?

-

- Rejoignez des centaines d'entreprises qui font confiance à Lions User Manager pour sécuriser et simplifier leur infrastructure d'identité. + +

+
+

+ Prêt à transformer votre gestion IAM ? +

+

+ Rejoignez les entreprises qui font confiance à Lions User Manager pour sécuriser leur infrastructure d'identité.

- + - Accéder à la plateforme maintenant + Accéder à la plateforme
-
+ -
-
+ diff --git a/src/main/resources/META-INF/resources/index.xhtml b/src/main/resources/META-INF/resources/index.xhtml index 03bdbf0..3283827 100644 --- a/src/main/resources/META-INF/resources/index.xhtml +++ b/src/main/resources/META-INF/resources/index.xhtml @@ -1,58 +1,191 @@ - + - - - - Lions User Manager - Gestion des Utilisateurs Keycloak - - - - - - + Accueil - Lions User Manager - -
-
-
- -

Lions User Manager

-

Gestion centralisée des utilisateurs Keycloak

- -
- - - - - - - - - - - + +
+ +
+
+
+ + +

+ Bienvenue, #{userSessionBean.fullName} +

+

+ Gestion centralisée des utilisateurs Keycloak +

+ +
+ + + Connecté + + + #{userSessionBean.primaryRole} + +
+
- -
-

Version 1.0.0

-

Module réutilisable pour l'écosystème LionsDev

+
+ + +
+
+

+ + Accès Rapide +

+ +
+ +
+ +
+
+
+ +
+ +
+

Utilisateurs

+

Gérer les comptes utilisateurs

+
+
+
+ + +
+ +
+
+
+ +
+ +
+

Rôles

+

Configurer les rôles et permissions

+
+
+
+ + +
+ +
+
+
+ +
+ +
+

Audit

+

Consulter le journal d'activité

+
+
+
+ + +
+ +
+
+
+ +
+ +
+

Synchronisation

+

Synchroniser avec Keycloak

+
+
+
+
+
+
+ + +
+
+

+ + Informations Système +

+
+
+ Application + Lions User Manager +
+
+ Version + 1.0.0 +
+
+ Realm Keycloak + lions-user-manager +
+
+ Statut + +
+
+
+
+ +
+
+

+ + Ma Session +

+
+
+ Utilisateur + #{userSessionBean.username} +
+
+ Email + #{userSessionBean.email} +
+
+ Rôle principal + +
+
+ Actions +
+ + Mon Profil + + + Dashboard + +
+
+
-
- - - +
+ diff --git a/src/main/resources/META-INF/resources/pages/user-manager/users/view.xhtml b/src/main/resources/META-INF/resources/pages/user-manager/users/view.xhtml index 23c5d5f..2b265ac 100644 --- a/src/main/resources/META-INF/resources/pages/user-manager/users/view.xhtml +++ b/src/main/resources/META-INF/resources/pages/user-manager/users/view.xhtml @@ -1,8 +1,11 @@ - + @@ -20,13 +23,10 @@
-
- -
-

Profil de l'Utilisateur

-

Détails et informations de l'utilisateur

-
-
+

+ + Profil Utilisateur +

Retour à la liste @@ -36,28 +36,394 @@
+ +
-
- - - - - - - - - - - - - +
+
+ +
+
+ +
+ #{userProfilBean.userInitials} +
+ + +

+ #{userProfilBean.user.prenom} #{userProfilBean.user.nom} +

+ + +

@#{userProfilBean.user.username}

+ + +

+ + #{userProfilBean.user.email} + + + +

+ + +
+ + + + Actif + + + + + + Inactif + + +
+ + +
+ + #{userProfilBean.primaryRoleName} + +
+
+
+ + +
+
+ +
+

+ + Informations Personnelles +

+ +
+ +

#{userProfilBean.user.username}

+
+ +
+ +

#{userProfilBean.user.prenom}

+
+ +
+ +

#{userProfilBean.user.nom}

+
+ +
+ +
+

#{userProfilBean.user.email}

+ + + + + + +
+
+ + +
+ +

#{userProfilBean.user.telephone}

+
+
+ + +
+ +

#{userProfilBean.user.langue}

+
+
+
+ + +
+

+ + Rôles et Permissions +

+ +
+ +
+ + + + + + + + Aucun rôle attribué + + +
+
+ +
+ +
+ + +
+
+ +
+ +

#{userProfilBean.primaryRoleName}

+
+ +
+ +
+ + + + + + +
+
+
+
+
+
+
+
+ + +
+
+

+ + Informations du Compte +

+ +
+
+

Contact et Organisation

+ + +
+ +
+ +

#{userProfilBean.user.organisation}

+
+
+
+ + +
+ +

#{userProfilBean.user.departement}

+
+
+ + +
+ +

#{userProfilBean.user.fonction}

+
+
+ + +
+ +
+ +

#{userProfilBean.user.pays}

+
+
+
+ + +
+ +

#{userProfilBean.user.ville}

+
+
+
+ +
+

Activité et Sécurité

+ +
+ +
+ +

+ #{userProfilBean.realmName} +

+
+
+ + +
+ +
+ +

+ + + +

+
+
+
+ + +
+ +
+ +

#{userProfilBean.user.activeSessions}

+
+
+
+ + +
+ +
+ + + +
+
+
+
+
+
+
+ + +
+
+

+ + Actions +

+ + +
+ +
+
+

+ + Gestion du Profil +

+
+ + + + + Modifier l'utilisateur + + + + + + + + +
+
+
+ + +
+
+

+ + Gestion du Compte +

+
+ + + + + + + + + + + + + + + +
+
+
+
+
+
@@ -80,6 +446,13 @@ + + - \ No newline at end of file + diff --git a/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-branded.png b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-branded.png new file mode 100644 index 0000000..c160810 Binary files /dev/null and b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-branded.png differ diff --git a/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-dark.png b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-dark.png new file mode 100644 index 0000000..c160810 Binary files /dev/null and b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo-dark.png differ diff --git a/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo.png b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo.png new file mode 100644 index 0000000..c160810 Binary files /dev/null and b/src/main/resources/META-INF/resources/resources/freya-layout/images/lions-logo.png differ diff --git a/src/main/resources/META-INF/resources/templates/components/layout/menu.xhtml b/src/main/resources/META-INF/resources/templates/components/layout/menu.xhtml index d7765a1..aa2ef5c 100644 --- a/src/main/resources/META-INF/resources/templates/components/layout/menu.xhtml +++ b/src/main/resources/META-INF/resources/templates/components/layout/menu.xhtml @@ -13,7 +13,7 @@