Class CacheSignedLinkStore

java.lang.Object
io.leandev.appfuse.security.link.store.CacheSignedLinkStore
All Implemented Interfaces:
SignedLinkStore

public class CacheSignedLinkStore extends Object implements SignedLinkStore

快取儲存實作

使用 AppFuse Cache 儲存單次連結的 jti。jti 自然過期後由快取自動清除。

快取 TTL 須涵蓋 SINGLE_USE 連結壽命:本實作不設定 per-entry TTL (框架 Cache API 無此能力),改依快取整體 TTL 清除。因此注入的快取 TTL 必須 不小於最長的 SINGLE_USE 連結有效期,否則 jti 會在 token 仍有效時就被逐出, 導致合法連結被誤判為「已使用」。registerttl 參數在本實作中僅供參考。

執行緒安全性 / 原子性:consume 以 get-then-remove 實作,依賴底層 Cache 的執行緒安全性,屬 best-effort——極高併發下理論上存在「同一 jti 被兩個請求 同時判定為存在」的極小重入窗(與 CacheTokenBlacklistStore 同等級)。需嚴格單次保證 或多節點佈署者,請改用真正原子的資料庫實作(見 SignedLinkStore)。

Since:
1.0
  • Constructor Details

    • CacheSignedLinkStore

      public CacheSignedLinkStore(Cache<String,Boolean> cache)
      建構快取儲存實作
      Parameters:
      cache - 快取實例(TTL 須 ≥ 最長 SINGLE_USE 連結有效期)
  • Method Details

    • register

      public void register(String jti, Duration ttl)
      Description copied from interface: SignedLinkStore
      登記一個單次連結的 jti
      Specified by:
      register in interface SignedLinkStore
      Parameters:
      jti - 連結的 JWT ID
      ttl - 連結有效期(供支援 per-entry 過期的實作使用;快取實作可改用快取整體 TTL)
    • consume

      public boolean consume(String jti)
      Description copied from interface: SignedLinkStore
      原子地消費一個 jti
      Specified by:
      consume in interface SignedLinkStore
      Parameters:
      jti - 連結的 JWT ID
      Returns:
      true 若 jti 原本存在且已被本次呼叫移除(首次使用);false 若不存在(已用過 / 已逾期)