Refactoring
This commit is contained in:
@@ -5,39 +5,133 @@ 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;
|
||||
|
||||
// Vérifications basées sur le rôle utilisateur
|
||||
|
||||
// Hiérarchie des rôles (de plus privilégié à moins privilégié)
|
||||
private static final List<String> 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;
|
||||
}
|
||||
|
||||
String userRole = userSession.getRole();
|
||||
return role.equals(userRole);
|
||||
|
||||
List<String> 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;
|
||||
}
|
||||
|
||||
String userRole = userSession.getRole();
|
||||
|
||||
List<String> userRoles = userSession.getRoles();
|
||||
if (userRoles == null || userRoles.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (String role : roles) {
|
||||
if (role.equals(userRole)) {
|
||||
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<String> 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<String> 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() {
|
||||
@@ -191,22 +285,45 @@ public class PermissionChecker implements Serializable {
|
||||
if (!userSession.isAuthenticated()) {
|
||||
return "guest-mode";
|
||||
}
|
||||
|
||||
String role = userSession.getRole();
|
||||
switch (role) {
|
||||
case "SUPER_ADMIN":
|
||||
return "super-admin-mode";
|
||||
case "ADMIN":
|
||||
return "admin-mode";
|
||||
case "GESTIONNAIRE_MEMBRE":
|
||||
return "gestionnaire-mode";
|
||||
case "TRESORIER":
|
||||
return "tresorier-mode";
|
||||
case "MEMBER":
|
||||
default:
|
||||
return "member-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<String> 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;
|
||||
@@ -236,4 +353,4 @@ public class PermissionChecker implements Serializable {
|
||||
public boolean isTresorier() {
|
||||
return hasRole("TRESORIER");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user