Löschen abgelaufener Token, die durch die Registrierung generiert wurden

Abgelaufene Token werden durch die Registrierung gelöscht

1. Überblick

In diesem Tutorial setzen wirthe ongoingRegistration with Spring Security series fort, um eine geplante Aufgabe zum Löschen abgelaufenerVerificationTokens einzurichten. Während des Registrierungsprozesses bleibt einVerificationToken bestehen. In diesem Artikel wird gezeigt, wie diese Entitäten entfernt werden.

2. Abgelaufenes Token entfernen

Erinnern Sie sich anfrom the prior article in the series, dass ein Verifikationstoken das MitgliedexpiryDate hat, das den Ablaufzeitstempel für das Token darstellt:

@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;
    ...
}

Wir werden dieseexpiryDate-Eigenschaft verwenden, um eine Abfrage mit Spring Data zu generieren.

Wenn Sie weitere Informationen zu Spring Data JPA suchen, sehen Sie sich diesearticlean.

2.1. Der Löschvorgang

Um das Entfernen von Token zu erleichtern, fügen wir unserenVerificationTokenRepository eine neue Methode zum Löschen abgelaufener Token hinzu:

public interface VerificationTokenRepository
  extends JpaRepository {

    void deleteByExpiryDateLessThan(Date now);
}

Die Verwendung vonquery keywordLessThan zeigt demquery creation-Mechanismus von Spring Data an, dass wir nur an Token interessiert sind, derenexpiryDate-Eigenschaft kürzer als die angegebene Zeit ist.

Beachten Sie, dassVerificationToken eine@OneToOne-Zuordnung zuUser hat, die mitFetchType.EAGER markiert ist,a select is also issued to populate the User entity - obwohl die Signatur vondeleteByExpiryDateLessThan den Rückgabetyp hat void:

select
    *
from
    VerificationToken verification
where
    verification.expiryDate < ?

select
    *
from
    user_account user
where
    user.id=?

delete from
    VerificationToken
where
    id=?

2.2. Das Löschen mit JPQL

Alternativ können wir eine JPQL-Abfrage erstellen, wenn die Entitäten nicht in den Persistenzkontext geladen werden müssen:

public interface VerificationTokenRepository
  extends JpaRepository {

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

Im Ruhezustand werden die Entitäten nicht in den Persistenzkontext geladen:

delete from
    VerificationToken
where
    expiryDate <= ?

3. Planen einer Token-Bereinigungsaufgabe

Wir haben jetzt eine Abfrage, die wir regelmäßig ausführen möchten. Wir werdenuse the scheduling support in Spring erstellen und eine Methode zum Ausführen unserer Löschlogik erstellen.

Wenn Sie weitere Informationen zum Spring Job Scheduling-Framework suchen, sehen Sie sich diesearticlean.

3.1. Zeitplanung aktivieren

Um die Planung von Aufgaben zu ermöglichen, erstellen wir eine neue KonfigurationsklasseSpringTaskConfig, die mit@EnableScheduling versehen ist:

@Configuration
@EnableScheduling
public class SpringTaskConfig {
    //
}

3.2. Token-Aufgabe löschen

In der Serviceebene rufen wir unser Repository mit der aktuellen Uhrzeit auf.

Anschließend kommentieren wir die Methode mit@Scheduled, um anzugeben, dass Spring sie regelmäßig ausführen soll:

@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. Der Stundenplan

Wir haben eine Eigenschaft verwendet, um den Wert der crontab-Einstellungen zu speichern, damit beim Ändern keine Neukompilierung erfolgt. Inapplication.properties weisen wir den Wert zu:

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

4. Fazit

In diesem Artikel haben wir die Entfernung vonVerificationTokens mitSpring Data JPA gelöst.

Wir haben die Erstellung von Abfragen mithilfe eines Eigenschaftsausdrucks demonstriert, um alle Token zu finden, deren Ablaufdatum unter einer bestimmten Zeit liegt. Und wir haben eine Task erstellt, um diese saubere Logik zur Laufzeit aufzurufen - und sie beim Spring Job Scheduling-Framework registriert, damit sie regelmäßig ausgeführt werden kann.

Die Implementierung dieses Lernprogramms zur Registrierung bei Spring Security finden Sie inthe github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.