登録によって生成された期限切れのトークンのパージ
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プロパティを使用して、SpringDataでクエリを生成します。
Spring Data JPAの詳細については、この記事をご覧ください。
2.1. 削除操作
トークンの削除を容易にするために、 VerificationTokenRepository に、期限切れのトークンを削除するための新しいメソッドを追加します。
public interface VerificationTokenRepository
extends JpaRepository<VerificationToken, Long> {
void deleteByExpiryDateLessThan(Date now);
}
queryキーワードLessThan の使用は、SpringDataのクエリ作成メカニズムに、ExpiryDateプロパティが少ないトークンのみに関心があることを示します。指定された時間より。
VerificationToken には、 FetchType.EAGERでマークされたユーザーとの@OneToOneの関連付けがあるため、aselectも発行されます。 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. スケジューリングを有効にする
タスクのスケジューリングを有効にするために、@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 DataJPAを使用してVerificationTokenの削除を解決しました。
プロパティ式を使用してクエリを作成し、有効期限が指定された時間よりも短いすべてのトークンを検索する方法を示しました。 そして、実行時にこのクリーンなロジックを呼び出すタスクを作成し、定期的に実行されるようにSpringJobSchedulingフレームワークに登録しました。
このRegistrationwithSpring Securityチュートリアルの実装は、 githubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。