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:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user