登録によって生成された期限切れトークンのパージ
1. 概要
このチュートリアルでは、the ongoingRegistration with Spring Security seriesを継続して、期限切れのVerificationTokensをパージするようにスケジュールされたタスクを設定します。 登録プロセス中、VerificationTokenが保持されます。 この記事では、これらのエンティティを削除する方法を示します。
2. 期限切れのトークンの削除
検証トークンには、トークンの有効期限タイムスタンプを表すメンバーexpiryDateがあることをfrom the prior article in the seriesで思い出してください。
@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プロパティを使用して、SpringDataでクエリを生成します。
Spring Data JPAの詳細をお探しの場合は、このarticleをご覧ください。
2.1. 削除操作
トークンの削除を容易にするために、期限切れのトークンを削除するための新しいメソッドをVerificationTokenRepositoryに追加します。
public interface VerificationTokenRepository
extends JpaRepository {
void deleteByExpiryDateLessThan(Date now);
}
query keywordLessThanの使用は、Spring Dataのquery creationメカニズムに対して、expiryDateプロパティが指定された時間よりも短いトークンのみに関心があることを示しています。
VerificationTokenはFetchType.EAGERでマークされたUserと@OneToOneの関連付けを持っているため、deleteByExpiryDateLessThanの署名には戻り値の型がありますが、a select is also issued to populate the User entityであることに注意してください。 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. スケジューリングを有効にする
タスクのスケジューリングを有効にするために、@EnableSchedulingで注釈が付けられた新しい構成クラスSpringTaskConfigを作成します。
@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. 結論
この記事では、Spring Data JPAを使用してVerificationTokensの削除を解決しました。
プロパティ式を使用して、指定された時間よりも短い有効期限を持つすべてのトークンを検索するクエリ作成を示しました。 そして、実行時にこのクリーンなロジックを呼び出すタスクを作成し、Spring Job Schedulingフレームワークに登録して定期的に実行しました。
このSpringSecurityでの登録チュートリアルの実装は、the github projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。