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