fix(security): audit RBAC complet v3.0 — rôles normalisés, lifecycle, changement mdp mobile

RBAC:
- HealthResource: @PermitAll
- RoleResource: @RolesAllowed ADMIN/SUPER_ADMIN/ADMIN_ORGANISATION class-level
- PropositionAideResource: @RolesAllowed MEMBRE/USER class-level
- AuthCallbackResource: @PermitAll
- EvenementResource: @PermitAll /publics et /test, count restreint
- BackupResource/LogsMonitoringResource/SystemResource: MODERATOR → MODERATEUR
- AnalyticsResource: MANAGER/MEMBER → ADMIN_ORGANISATION/MEMBRE
- RoleConstant.java: constantes de rôles centralisées

Cycle de vie membres:
- MemberLifecycleService: ajouterMembre()/retirerMembre() sur activation/radiation/archivage
- MembreResource: endpoint GET /numero/{numeroMembre}
- MembreService: méthode trouverParNumeroMembre()

Changement mot de passe:
- CompteAdherentResource: endpoint POST /auth/change-password (mobile)
- MembreKeycloakSyncService: changerMotDePasseDirectKeycloak() via API Admin Keycloak directe
- Fallback automatique si lions-user-manager indisponible

Workflow:
- Flyway V17-V23: rôles, types org, formules Option C, lifecycle columns, bareme cotisation
- Nouvelles classes: MemberLifecycleService, OrganisationModuleService, scheduler
- Security: OrganisationContextFilter, OrganisationContextHolder, ModuleAccessFilter
This commit is contained in:
dahoud
2026-04-07 20:52:26 +00:00
parent c74ae25ad6
commit a2dfae9a0b
78 changed files with 5637 additions and 271 deletions

View File

@@ -0,0 +1,62 @@
package dev.lions.unionflow.server.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import lombok.*;
/**
* Barème de cotisation par rôle fonctionnel au sein d'une organisation.
*
* <p>Permet de définir des montants différenciés selon le rôle du membre
* (PRESIDENT, TRESORIER, MEMBRE_ORDINAIRE, etc.).
*
* <p>Si aucun barème n'est défini pour un rôle donné, le système utilise
* le montant par défaut de {@link ParametresCotisationOrganisation}.
*
* <p>Table : {@code bareme_cotisation_role}
*/
@Entity
@Table(
name = "bareme_cotisation_role",
uniqueConstraints = @UniqueConstraint(
name = "uq_bareme_cot_org_role",
columnNames = {"organisation_id", "role_org"}
)
)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class BaremeCotisationRole extends BaseEntity {
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "organisation_id", nullable = false)
private Organisation organisation;
/**
* Rôle fonctionnel dans l'organisation (ex: PRESIDENT, TRESORIER, SECRETAIRE, MEMBRE_ORDINAIRE).
* Correspond à {@link dev.lions.unionflow.server.entity.MembreOrganisation#getRoleOrg()}.
*/
@NotBlank
@Column(name = "role_org", nullable = false, length = 50)
private String roleOrg;
@Builder.Default
@DecimalMin("0.00")
@Digits(integer = 10, fraction = 2)
@Column(name = "montant_mensuel", nullable = false, precision = 12, scale = 2)
private BigDecimal montantMensuel = BigDecimal.ZERO;
@Builder.Default
@DecimalMin("0.00")
@Digits(integer = 10, fraction = 2)
@Column(name = "montant_annuel", nullable = false, precision = 12, scale = 2)
private BigDecimal montantAnnuel = BigDecimal.ZERO;
/** Description optionnelle du barème (ex: "Taux réduit bureau exécutif"). */
@Column(name = "description", length = 255)
private String description;
}

View File

@@ -73,6 +73,15 @@ public class ParametresCotisationOrganisation extends BaseEntity {
@Column(name = "cotisation_obligatoire", nullable = false)
private Boolean cotisationObligatoire = true;
/**
* Active la génération automatique mensuelle des cotisations pour cette organisation.
* Quand {@code true}, un job planifié crée automatiquement une cotisation par membre actif
* le 1er de chaque mois, en utilisant les barèmes par rôle ou le montant par défaut.
*/
@Builder.Default
@Column(name = "generation_automatique_activee", nullable = false)
private Boolean generationAutomatiqueActivee = false;
// ── Méthodes métier ────────────────────────────────────────────────────────
/**