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,63 @@
package dev.lions.unionflow.server.scheduler;
import dev.lions.unionflow.server.service.MemberLifecycleService;
import io.quarkus.scheduler.Scheduled;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;
/**
* Planificateur automatique pour le cycle de vie des membres.
*
* <p>Tâches exécutées périodiquement :
* <ul>
* <li>Toutes les heures : rappels d'invitation expirant dans 24h</li>
* <li>Tous les jours à 02:00 : expiration des invitations périmées</li>
* </ul>
*
* <p>Utilise le module {@code quarkus-scheduler} (déjà dans le pom.xml).
* En production, les expressions cron peuvent être configurées via :
* {@code unionflow.lifecycle.invitation.expiry.cron} dans application.properties.
*/
@ApplicationScoped
public class MemberLifecycleScheduler {
private static final Logger LOG = Logger.getLogger(MemberLifecycleScheduler.class);
@Inject
MemberLifecycleService lifecycleService;
/**
* Envoie des rappels pour les invitations qui expirent dans les 24 prochaines heures.
* Exécuté toutes les heures.
*/
@Scheduled(cron = "${unionflow.lifecycle.reminder.cron:0 0 * * * ?}",
identity = "membre-invitation-reminder")
void rappelerInvitationsExpirantBientot() {
try {
int count = lifecycleService.envoyerRappelsInvitation();
if (count > 0) {
LOG.infof("[Scheduler] Rappels d'invitation envoyés : %d", count);
}
} catch (Exception e) {
LOG.errorf(e, "[Scheduler] Erreur lors de l'envoi des rappels d'invitation");
}
}
/**
* Expire les invitations dont la date limite est dépassée.
* Exécuté chaque nuit à 02:00.
*/
@Scheduled(cron = "${unionflow.lifecycle.expiry.cron:0 0 2 * * ?}",
identity = "membre-invitation-expiry")
void expirerInvitations() {
try {
int count = lifecycleService.expirerInvitations();
if (count > 0) {
LOG.infof("[Scheduler] Invitations expirées traitées : %d", count);
}
} catch (Exception e) {
LOG.errorf(e, "[Scheduler] Erreur lors de l'expiration des invitations");
}
}
}