1. Обзор
В этом руководстве мы продолжаем текущую серию « Регистрация в Spring Security
», чтобы настроить запланированную задачу для очистки VerificationToken
с истекшим сроком действия. В процессе регистрации VerificationToken
сохраняется. В этой статье мы покажем, как удалить эти сущности.
2. Удаление токена с истекшим сроком действия
Напомним из предыдущей статьи серии , что токен проверки имеет элемент 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.
Если вам нужна дополнительная информация о Spring Data JPA, ознакомьтесь с этой статьей .
2.1. Операция удаления
Чтобы облегчить удаление токена, мы добавим в наш VerificationTokenRepository
новый метод для удаления токенов с истекшим сроком действия:
public interface VerificationTokenRepository
extends JpaRepository<VerificationToken, Long> {
void deleteByExpiryDateLessThan(Date now);
}
Использование ключевого слова запроса LessThan
указывает механизму создания запросов Spring Data, что нас интересуют только токены, свойство expiryDate
которых меньше указанного времени.
Обратите внимание, что поскольку VerificationToken
имеет ассоциацию @OneToOne
с пользователем
, отмеченным FetchType.EAGER
, выбор также выдается для заполнения сущности пользователя
, даже несмотря на то, что сигнатура 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<VerificationToken, Long> {
@Modifying
@Query("delete from VerificationToken t where t.expiryDate <= ?1")
void deleteAllExpiredSince(Date now);
}
И Hibernate не будет загружать сущности в контекст сохранения:
delete from
VerificationToken
where
expiryDate <= ?
3. Планирование задачи очистки токенов
Теперь у нас есть запрос, который мы хотим периодически выполнять; Мы будем использовать поддержку планирования в Spring и создадим метод для запуска нашей логики удаления.
Если вам нужна дополнительная информация о фреймворке Spring Job Scheduling, ознакомьтесь с этой статьей .
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. Вывод
В этой статье мы решили удалить VerificationToken
с помощью Spring Data JPA .
Мы продемонстрировали создание запроса с использованием выражения свойства для поиска всех токенов, срок действия которых меньше указанного времени. И мы создали задачу для вызова этой чистой логики во время выполнения — и зарегистрировали ее в структуре Spring Job Scheduling для периодического выполнения.
Реализацию этого руководства по регистрации с помощью Spring Security можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.