Purge des jetons expirés générés par l’enregistrement

Purge des jetons expirés générés par l'enregistrement

1. Vue d'ensemble

Dans ce didacticiel, nous continuonsthe ongoingRegistration with Spring Security series à configurer une tâche planifiée pour purger lesVerificationToken expirés. Pendant le processus d'enregistrement, unVerificationToken est conservé. Dans cet article, nous montrerons comment supprimer ces entités.

2. Suppression d'un jeton expiré

Rappelez àfrom the prior article in the series qu'un jeton de vérification a le membreexpiryDate, représentant l'horodatage d'expiration du jeton:

@Entity
public class VerificationToken {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String token;

    @OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, name = "user_id",
      foreignKey = @ForeignKey(name="FK_VERIFY_USER"))
    private User user;

    private Date expiryDate;
    ...
}

Nous utiliserons cette propriétéexpiryDate pour générer une requête avec Spring Data.

Si vous recherchez plus d'informations sur Spring Data JPA, jetez un œil à cesarticle.

2.1. L'opération de suppression

Pour faciliter la suppression des jetons, nous allons ajouter une nouvelle méthode à nosVerificationTokenRepository pour supprimer les jetons expirés:

public interface VerificationTokenRepository
  extends JpaRepository {

    void deleteByExpiryDateLessThan(Date now);
}

L'utilisation desquery keywordLessThan indique au mécanismequery creation de Spring Data que nous ne sommes intéressés que par les jetons dont la propriétéexpiryDate est inférieure au temps spécifié.

Notez que puisqueVerificationToken a une association@OneToOne avecUser marqué avecFetchType.EAGER,a select is also issued to populate the User entity - même si la signature dedeleteByExpiryDateLessThan a le type de retour void:

select
    *
from
    VerificationToken verification
where
    verification.expiryDate < ?

select
    *
from
    user_account user
where
    user.id=?

delete from
    VerificationToken
where
    id=?

2.2. La suppression avec JPQL

Alternativement, nous pouvons créer une requête JPQL si nous n'avons pas besoin de charger les entités dans le contexte de persistance:

public interface VerificationTokenRepository
  extends JpaRepository {

    @Modifying
    @Query("delete from VerificationToken t where t.expiryDate <= ?1")
    void deleteAllExpiredSince(Date now);
}

Et Hibernate ne chargera pas les entités dans le contexte de persistance:

delete from
    VerificationToken
where
    expiryDate <= ?

3. Planification d'une tâche de purge de jeton

Nous avons maintenant une requête que nous voulons exécuter périodiquement; Nous allonsuse the scheduling support in Spring et créer une méthode pour exécuter notre logique de suppression.

Si vous recherchez plus d'informations sur le framework Spring Job Scheduling, jetez un œil à cesarticle.

3.1. Activer la planification

Pour activer la planification des tâches, nous créons une nouvelle classe de configurationSpringTaskConfig annotée avec@EnableScheduling:

@Configuration
@EnableScheduling
public class SpringTaskConfig {
    //
}

3.2. Tâche de purge du jeton

Dans la couche de service, nous appelons notre référentiel avec l'heure actuelle.

Nous annotons ensuite la méthode avec@Scheduled pour indiquer que Spring doit l'exécuter périodiquement:

@Service
@Transactional
public class TokensPurgeTask {

    @Autowired
    private VerificationTokenRepository tokenRepository;

    @Scheduled(cron = "${purge.cron.expression}")
    public void purgeExpired() {
        Date now = Date.from(Instant.now());
        tokenRepository.deleteAllExpiredSince(now);
    }
}

3.3. L'horaire

Nous avons utilisé une propriété pour contenir la valeur des paramètres de la crontab afin d'éviter une recompilation lors de la modification. Dans lesapplication.properties, nous attribuons la valeur:

#    5am every day
purge.cron.expression=0 0 5 * * ?

4. Conclusion

Dans cet article, nous avons résolu la suppression deVerificationTokens en utilisantSpring Data JPA.

Nous avons démontré la création de requêtes en utilisant une expression de propriété pour rechercher tous les jetons ayant une date d'expiration inférieure à une heure spécifiée. Et nous avons créé une tâche pour appeler cette logique de nettoyage au moment de l'exécution - et l'avons enregistrée avec le framework Spring Job Scheduling pour qu'il soit exécuté périodiquement.

L'implémentation de ce didacticiel d'enregistrement avec Spring Security se trouve dansthe github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.