登録によって生成された期限切れトークンの消去

登録によって生成された期限切れトークンのパージ

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プロパティが指定された時間よりも短いトークンのみに関心があることを示しています。

VerificationTokenFetchType.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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。