Limpando Tokens Expirados Gerados pelo Registro
1. Visão geral
Neste tutorial - continuamosthe ongoingRegistration with Spring Security series para configurar uma tarefa agendada para limparVerificationTokens expirado. Durante o processo de registro, umVerificationToken é persistido. Neste artigo, mostraremos como remover essas entidades.
2. Removendo um Token Expirado
Lembre-se defrom the prior article in the series que um token de verificação tem o membroexpiryDate, representando o carimbo de data / hora de expiração do token:
@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;
...
}
Usaremos esta propriedadeexpiryDate para gerar uma consulta com Spring Data.
Se você estiver procurando por mais informações sobre Spring Data JPA, dê uma olhada nestearticle.
2.1. A operação de exclusão
Para facilitar a remoção do token, adicionaremos um novo método ao nossoVerificationTokenRepository para excluir tokens expirados:
public interface VerificationTokenRepository
extends JpaRepository {
void deleteByExpiryDateLessThan(Date now);
}
O uso dequery keywordLessThan indica ao mecanismoquery creation do Spring Data que estamos interessados apenas em tokens cuja propriedadeexpiryDate é menor que o tempo especificado.
Observe que, comoVerificationToken tem uma associação@OneToOne comUser marcada comFetchType.EAGER,a select is also issued to populate the User entity - embora a assinatura dedeleteByExpiryDateLessThan tenha o tipo de retorno void:
select
*
from
VerificationToken verification
where
verification.expiryDate < ?
select
*
from
user_account user
where
user.id=?
delete from
VerificationToken
where
id=?
2.2. O Excluir com JPQL
Como alternativa, podemos criar uma consulta JPQL se não precisarmos carregar as entidades no contexto de persistência:
public interface VerificationTokenRepository
extends JpaRepository {
@Modifying
@Query("delete from VerificationToken t where t.expiryDate <= ?1")
void deleteAllExpiredSince(Date now);
}
E o Hibernate não carregará as entidades no contexto de persistência:
delete from
VerificationToken
where
expiryDate <= ?
3. Agendando uma tarefa de eliminação de token
Agora temos uma consulta que queremos executar periodicamente; Vamosuse the scheduling support in Springe criar um método para executar nossa lógica de exclusão.
Se você estiver procurando por mais informações sobre a estrutura do Spring Job Scheduling, dê uma olhada nestearticle.
3.1. Habilitar agendamento
Para permitir o agendamento de tarefas, criamos uma nova classe de configuraçãoSpringTaskConfig anotada com@EnableScheduling:
@Configuration
@EnableScheduling
public class SpringTaskConfig {
//
}
3.2. Limpar tarefa de token
Na camada de serviço, chamamos nosso repositório com o horário atual.
Em seguida, anotamos o método com@Scheduled para indicar que o Spring deve executá-lo periodicamente:
@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. O horário
Usamos uma propriedade para armazenar o valor das configurações do crontab para evitar a recompilação quando alterada. Emapplication.properties atribuímos o valor:
# 5am every day
purge.cron.expression=0 0 5 * * ?
4. Conclusão
Neste artigo, resolvemos a remoção deVerificationTokens usandoSpring Data JPA.
Demonstramos a criação da consulta usando uma expressão de propriedade para encontrar todos os tokens com uma data de validade menor que um tempo especificado. E criamos uma tarefa para chamar essa lógica limpa em tempo de execução - e a registramos na estrutura do Spring Job Scheduling para ser executada periodicamente.
A implementação deste tutorial de Registro com Spring Security pode ser encontrada emthe github project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.