package dev.lions.unionflow.client.security; import dev.lions.unionflow.client.view.UserSession; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.inject.Named; import java.io.Serializable; import java.util.Arrays; import java.util.List; /** * Service de vérification des permissions utilisateur * * SÉCURITÉ: * - Support des rôles multiples * - Hiérarchie de permissions (SUPER_ADMIN > ADMIN > GESTIONNAIRE > MEMBER) * - Vérification granulaire par fonctionnalité * * @author UnionFlow Team * @version 2.0 */ @Named("permissionChecker") @RequestScoped public class PermissionChecker implements Serializable { private static final long serialVersionUID = 1L; @Inject private UserSession userSession; // Hiérarchie des rôles (de plus privilégié à moins privilégié) private static final List ROLE_HIERARCHY = Arrays.asList( "SUPER_ADMIN", "ADMIN_ENTITE", "ADMIN", "GESTIONNAIRE_MEMBRE", "GESTIONNAIRE_EVENEMENT", "GESTIONNAIRE_AIDE", "GESTIONNAIRE_FINANCE", "TRESORIER", "MEMBRE", "MEMBER" ); /** * Vérifie si l'utilisateur possède un rôle spécifique * SÉCURITÉ: Support des rôles multiples */ public boolean hasRole(String role) { if (userSession == null || !userSession.isAuthenticated()) { return false; } List userRoles = userSession.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return false; } return userRoles.contains(role); } /** * Vérifie si l'utilisateur possède au moins un des rôles spécifiés * SÉCURITÉ: Support des rôles multiples */ public boolean hasAnyRole(String... roles) { if (userSession == null || !userSession.isAuthenticated()) { return false; } List userRoles = userSession.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return false; } for (String role : roles) { if (userRoles.contains(role)) { return true; } } return false; } /** * Vérifie si l'utilisateur possède TOUS les rôles spécifiés * SÉCURITÉ: Vérification stricte pour permissions combinées */ public boolean hasAllRoles(String... roles) { if (userSession == null || !userSession.isAuthenticated()) { return false; } List userRoles = userSession.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return false; } for (String role : roles) { if (!userRoles.contains(role)) { return false; } } return true; } /** * Vérifie si l'utilisateur a un niveau de privilège au moins égal au rôle spécifié * SÉCURITÉ: Hiérarchie de rôles (SUPER_ADMIN peut tout faire) */ public boolean hasRoleOrHigher(String role) { if (userSession == null || !userSession.isAuthenticated()) { return false; } List userRoles = userSession.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return false; } int requiredLevel = ROLE_HIERARCHY.indexOf(role); if (requiredLevel == -1) { return false; // Rôle inconnu } // Vérifier si l'utilisateur a un rôle de niveau égal ou supérieur for (String userRole : userRoles) { int userLevel = ROLE_HIERARCHY.indexOf(userRole); if (userLevel != -1 && userLevel <= requiredLevel) { return true; // Niveau supérieur ou égal trouvé } } return false; } // Vérifications basées sur les permissions public boolean canManageMembers() { return hasAnyRole("ADMIN", "GESTIONNAIRE_MEMBRE"); } public boolean canValidateMembers() { return hasAnyRole("ADMIN", "GESTIONNAIRE_MEMBRE"); } public boolean canManageFinances() { return hasAnyRole("ADMIN", "TRESORIER", "GESTIONNAIRE_FINANCE"); } public boolean canManageEvents() { return hasAnyRole("ADMIN", "GESTIONNAIRE_EVENEMENT"); } public boolean canManageAides() { return hasAnyRole("ADMIN", "GESTIONNAIRE_AIDE"); } public boolean canViewReports() { return hasAnyRole("ADMIN", "GESTIONNAIRE_MEMBRE", "TRESORIER"); } public boolean canManageSubscription() { return hasRole("ADMIN"); } public boolean canManageOrganization() { return hasRole("ADMIN"); } public boolean canAccessSuperAdmin() { return hasRole("SUPER_ADMIN"); } // Vérifications basées sur les fonctionnalités du forfait public boolean isFeatureEnabled(String feature) { // Cette méthode vérifiera si la fonctionnalité est incluse dans le forfait souscrit // Pour l'instant, simulation basée sur des rôles switch (feature.toLowerCase()) { case "gestion_membres": return true; // Toujours disponible case "gestion_cotisations": return true; // Toujours disponible case "gestion_evenements": return !hasRole("MEMBER"); // Pas pour les membres simples case "gestion_aides": return hasAnyRole("ADMIN", "GESTIONNAIRE_AIDE"); case "rapports_avances": return hasAnyRole("ADMIN", "SUPER_ADMIN"); case "integration_paiement": return hasAnyRole("ADMIN", "TRESORIER"); case "notifications_sms": return hasAnyRole("ADMIN", "SUPER_ADMIN"); case "gestion_documents": return hasAnyRole("ADMIN", "GESTIONNAIRE_MEMBRE"); case "support_prioritaire": return hasAnyRole("ADMIN", "SUPER_ADMIN"); case "personnalisation_avancee": return hasRole("SUPER_ADMIN"); default: return false; } } // Vérifications pour l'interface utilisateur public boolean showCreateMemberButton() { return canManageMembers() && isFeatureEnabled("gestion_membres"); } public boolean showValidateMemberButton() { return canValidateMembers() && isFeatureEnabled("gestion_membres"); } public boolean showFinancialSection() { return canManageFinances() && isFeatureEnabled("gestion_cotisations"); } public boolean showEventsSection() { return canManageEvents() && isFeatureEnabled("gestion_evenements"); } public boolean showAidesSection() { return canManageAides() && isFeatureEnabled("gestion_aides"); } public boolean showReportsSection() { return canViewReports() && isFeatureEnabled("rapports_avances"); } public boolean showSubscriptionManagement() { return canManageSubscription(); } public boolean showAdvancedSettings() { return canManageOrganization() && isFeatureEnabled("personnalisation_avancee"); } public boolean showSuperAdminFeatures() { return canAccessSuperAdmin(); } // Vérifications spécifiques aux actions public boolean canCreateEvent() { return canManageEvents() && isFeatureEnabled("gestion_evenements"); } public boolean canProcessAideRequest() { return canManageAides() && isFeatureEnabled("gestion_aides"); } public boolean canExportData() { return canViewReports() && isFeatureEnabled("rapports_avances"); } public boolean canSendNotifications() { return canManageMembers() && (isFeatureEnabled("notifications_email") || isFeatureEnabled("notifications_sms")); } public boolean canManageDocuments() { return canManageMembers() && isFeatureEnabled("gestion_documents"); } // Vérifications pour les limites public boolean canAddNewMember() { if (!canManageMembers()) { return false; } // Vérifier le quota de membres (sera implémenté avec SouscriptionBean) // Pour l'instant, toujours vrai si on a les permissions return true; } // Méthodes utilitaires pour l'affichage conditionnel public String getRoleBasedStyleClass() { if (!userSession.isAuthenticated()) { return "guest-mode"; } // Déterminer le style basé sur le rôle le plus privilégié if (hasRole("SUPER_ADMIN")) { return "super-admin-mode"; } else if (hasAnyRole("ADMIN", "ADMIN_ENTITE")) { return "admin-mode"; } else if (hasAnyRole("GESTIONNAIRE_MEMBRE", "GESTIONNAIRE_EVENEMENT", "GESTIONNAIRE_AIDE", "GESTIONNAIRE_FINANCE")) { return "gestionnaire-mode"; } else if (hasRole("TRESORIER")) { return "tresorier-mode"; } else { return "member-mode"; } } /** * Retourne le rôle le plus privilégié de l'utilisateur * SÉCURITÉ: Basé sur la hiérarchie définie */ public String getHighestRole() { if (userSession == null || !userSession.isAuthenticated()) { return null; } List userRoles = userSession.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return null; } // Retourner le premier rôle trouvé dans la hiérarchie for (String hierarchyRole : ROLE_HIERARCHY) { if (userRoles.contains(hierarchyRole)) { return hierarchyRole; } } // Si aucun rôle connu, retourner le premier de la liste return userRoles.get(0); } public String getPermissionMessage(String action) { return "Vous n'avez pas les permissions nécessaires pour " + action; } // Getters pour utilisation dans les expressions EL public boolean isAuthenticated() { return userSession != null && userSession.isAuthenticated(); } public boolean isSuperAdmin() { return hasRole("SUPER_ADMIN"); } public boolean isAdmin() { return hasRole("ADMIN"); } public boolean isMember() { return hasRole("MEMBER"); } public boolean isGestionnaire() { return hasAnyRole("GESTIONNAIRE_MEMBRE", "GESTIONNAIRE_EVENEMENT", "GESTIONNAIRE_AIDE", "GESTIONNAIRE_FINANCE"); } public boolean isTresorier() { return hasRole("TRESORIER"); } }