Очистка просроченных токенов, сгенерированных регистрацией

Очистка просроченных токенов, созданных при регистрации

1. обзор

В этом руководстве мы продолжаемthe ongoingRegistration with Spring Security series настроить запланированную задачу для очистки просроченногоVerificationTokens. В процессе регистрации сохраняетсяVerificationToken. В этой статье мы покажем, как удалить эти объекты.

2. Удаление просроченного токена

Напомнимfrom the prior article in the series, что у токена проверки есть членexpiryDate, представляющий отметку времени истечения срока действия токена:

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

Мы будем использовать это свойствоexpiryDate для создания запроса с помощью Spring Data.

Если вам нужна дополнительная информация о Spring Data JPA, взгляните на этотarticle.

2.1. Операция удаления

Чтобы упростить удаление токенов, мы добавим новый метод к нашемуVerificationTokenRepository для удаления просроченных токенов:

public interface VerificationTokenRepository
  extends JpaRepository {

    void deleteByExpiryDateLessThan(Date now);
}

Использованиеquery keywordLessThan указывает механизмуquery creation Spring Data, что нас интересуют только токены, у которых свойствоexpiryDate меньше указанного времени.

Обратите внимание: посколькуVerificationToken имеет ассоциацию@OneToOne сUser, отмеченнымFetchType.EAGER,a select is also issued to populate the User entity - даже если сигнатураdeleteByExpiryDateLessThan имеет тип возврата void:

select
    *
from
    VerificationToken verification
where
    verification.expiryDate < ?

select
    *
from
    user_account user
where
    user.id=?

delete from
    VerificationToken
where
    id=?

2.2. Удаление с помощью JPQL

В качестве альтернативы, мы можем создать запрос JPQL, если у нас нет необходимости загружать сущности в контекст постоянства:

public interface VerificationTokenRepository
  extends JpaRepository {

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

И Hibernate не будет загружать сущности в контекст постоянства:

delete from
    VerificationToken
where
    expiryDate <= ?

3. Планирование задачи очистки токена

Теперь у нас есть запрос, который мы хотим периодически выполнять; Мы введемuse the scheduling support in Spring и создадим метод для запуска нашей логики удаления.

Если вам нужна дополнительная информация о фреймворке Spring Job Scheduling, взгляните на этотarticle.

3.1. Включить планирование

Чтобы включить планирование задач, мы создаем новый класс конфигурацииSpringTaskConfig, аннотированный@EnableScheduling:

@Configuration
@EnableScheduling
public class SpringTaskConfig {
    //
}

3.2. Очистить задачу токена

На уровне сервиса мы называем наш репозиторий с текущим временем.

Затем мы аннотируем метод@Scheduled, чтобы указать, что Spring должен выполнять его периодически:

@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. Расписание

Мы использовали свойство для хранения значения настроек crontab, чтобы избежать перекомпиляции при изменении. Вapplication.properties мы присваиваем значение:

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

4. Заключение

В этой статье мы решили удалитьVerificationTokens с помощьюSpring Data JPA.

Мы продемонстрировали создание запроса с использованием выражения свойства, чтобы найти все токены, срок действия которых меньше указанного времени. И мы создали задачу для вызова этой чистой логики во время выполнения - и зарегистрировали ее в среде Spring Job Scheduling для периодического выполнения.

Реализацию этого руководства по регистрации с помощью Spring Security можно найти вthe github project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.