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

1概要

このチュートリアルでは、リンクを続けています。/spring-security-registration Spring Security seriesへの登録 登録プロセス中、 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;
    ...
}

Spring Dataでクエリを生成するには、この expiryDate プロパティを使用します。

Spring Data JPAの詳細については、次のリンクを参照してください。/永続化レイヤ - スプリングデータ付きjpa#customquery[article]

2.1. 削除操作

トークンの削除を容易にするために、期限切れのトークンを削除するための新しいメソッドを VerificationTokenRepository に追加します。

public interface VerificationTokenRepository
  extends JpaRepository<VerificationToken, Long> {

    void deleteByExpiryDateLessThan(Date now);
}

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords LessThan の使用は、Spring Dataのhttp://docs.springを示しています。 .io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation[クエリ作成]メカニズムは、 expiryDate プロパティが指定された時間より短いトークンにのみ関心があります。 。

VerificationToken には FetchType.EAGER でマークされた User との @ OneToOne 関連があるため、 deleteByExpiryDateLessThan のシグネチャの戻り型が void であっても、 User エンティティを設定するためのselect ** も発行されます。

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フレームワークの詳細については、/spring-schedule-tasks[article]のリンクをご覧ください。

3.1. スケジュールを有効にする

タスクのスケジューリングを有効にするために、 @ EnableScheduling というアノテーションを付けた新しい設定クラス SpringTaskConfig を作成します。

@Configuration
@EnableScheduling
public class SpringTaskConfig {
   //}

3.2. トークン削除タスク

サービス層では、現在時刻をリポジトリと呼びます。

次に、Springに定期的に実行するように、メソッドに @ Scheduled という注釈を付けます。

@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 を使用して __VerificationToken __sの削除を解決しました。

指定された時間よりも短い有効期限を持つすべてのトークンを見つけるために、プロパティ式を使ったクエリ作成を実演しました。実行時にこのクリーンなロジックを呼び出すタスクを作成し、定期的に実行されるようにSpring Job Schedulingフレームワークに登録しました。

このSpring Securityへの登録のチュートリアルは、https://github.com/eugenp/spring-security-registration[the github project]にあります。これはEclipseベースのプロジェクトなので、インポートおよび実行が簡単です。そのまま。

前の投稿:Spring Bootの終了コード
次の投稿:Java String.regionMatches()