Limpando Tokens Expirados Gerados pelo Registro

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á.