Очистка просроченных токенов, созданных при регистрации
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, поэтому его должно быть легко импортировать и запускать как есть.