クラス TokenBasedRememberMeServices

java.lang.ObjectSE
org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices
実装されたすべてのインターフェース:
org.springframework.beans.factory.Awareorg.springframework.beans.factory.InitializingBeanorg.springframework.context.MessageSourceAwareLogoutHandlerRememberMeServices

public class TokenBasedRememberMeServices extends AbstractRememberMeServices
以前に記憶したユーザーを Base-64 エンコード Cookie で識別します。

この実装は外部データベースに依存しないため、単純なアプリケーションにとって魅力的です。Cookie は、最後の AbstractRememberMeServices.loginSuccess(HttpServletRequest, HttpServletResponse, Authentication) の日付から特定の期間有効です。インターフェース規約に従って、このメソッドは、プリンシパルが対話型認証に成功した場合にのみ呼び出されます。そのため、この期間は、資格情報を提供した最後の認証試行から始まります。remember-me を介して最後にログインした期間ではありません。実装は、AbstractRememberMeServices.setParameter(String) によって定義されたパラメーターが存在する場合にのみ、remember-me トークンを送信します。

この実装には UserDetailsService が必要です。これにより、返される UserDetails から有効な Authentication を構築できます。これは、ユーザーのパスワードが使用可能であり、エンコードされた Cookie の一部として確認できるようにするためにも必要です。

この実装によってエンコードされた Cookie は、次の形式を採用しています。

 username + ":" + expiryTime + ":" + algorithmName + ":"
                + algorithmHex(username + ":" + expiryTime + ":" + password + ":" + key)
 

この実装では、encodingAlgorithm で構成されたアルゴリズムを使用して署名をエンコードします。algorithmName から取得したアルゴリズムを使用して署名を検証しようとします。ただし、algorithmName が Cookie 値に存在しない場合は、matchingAlgorithm で構成されたアルゴリズムを使用して署名が検証されます。これにより、ユーザーは、algorithmName が存在しない場合でも古いアルゴリズムを検証しながら、別のエンコードアルゴリズムに安全にアップグレードできます。

そのため、ユーザーがパスワードを変更すると、remember-me トークンは無効になります。同様に、システム管理者は、キーを変更することにより、課題となっているすべての remember-me トークンを無効にすることができます。これは、パブリックマシン(キオスクシステム、インターネットカフェなど)に残された記憶ミートークンから回復するためのいくつかの合理的なアプローチを提供します。最も重要なことは、ユーザーのパスワードがユーザーエージェントに送信されることは決してなく、重要なセキュリティ保護を提供することです。残念ながら、この実装ではユーザー名が必要です(remember-me サービスをデータベースに依存したくないため)。高度なセキュリティアプリケーションは、有効なユーザー名のこの時々の望ましくない開示に注意する必要があります。

これは、多くのアプリケーションに適した基本的な remember-me 実装です。ただし、より安全な記憶方式のアプローチが必要な場合は、データベースベースの実装をお勧めします(PersistentTokenBasedRememberMeServices を参照)。

デフォルトでは、トークンは最後に成功した認証試行から 14 日間有効です。これは AbstractRememberMeServices.setTokenValiditySeconds(int) を使用して変更できます。この値が 0 未満の場合、expiryTime は 14 日間のままですが、Cookie の maxAge プロパティには負の値が使用され、ブラウザーが閉じられると保存されなくなります。

  • コンストラクターの詳細

  • メソッドの詳細

    • processAutoLoginCookie

      protected UserDetails processAutoLoginCookie(StringSE[] cookieTokens, jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response)
      クラスからコピーされた説明: AbstractRememberMeServices
      送信された永続的なログインクッキーを処理するために autoLogin から呼び出されます。サブクラスはクッキーを検証し、必要な追加の管理を実行する必要があります。
      次で指定:
      クラス AbstractRememberMeServicesprocessAutoLoginCookie 
      パラメーター:
      cookieTokens - デコードおよびトークン化された Cookie 値
      request - リクエスト
      response - 必要に応じて Cookie を変更できるようにするレスポンス。
      戻り値:
      Cookie が正常に検証された場合、対応するユーザーアカウントの UserDetails。
    • makeTokenSignature

      protected StringSE makeTokenSignature(long tokenExpiryTime, StringSE username, StringSE password)
      Cookie に入れるデジタル署名を計算します。デフォルト値は encodingAlgorithm に適用されます (「ユーザー名: tokenExpiryTime: パスワード: キー」)
    • makeTokenSignature

      protected StringSE makeTokenSignature(long tokenExpiryTime, StringSE username, StringSE password, TokenBasedRememberMeServices.RememberMeTokenAlgorithm algorithm)
      Cookie に入れるデジタル署名を計算します。
      導入:
      5.8
    • isTokenExpired

      protected boolean isTokenExpired(long tokenExpiryTime)
    • onLoginSuccess

      public void onLoginSuccess(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Authentication successfulAuthentication)
      クラスからコピーされた説明: AbstractRememberMeServices
      Remember-Me ログインがリクエストされたときに loginSuccess から呼び出されます。通常、サブクラスによって実装され、Remember-Me Cookie を設定し、実装で必要な場合はその記録を保存します。
      次で指定:
      クラス AbstractRememberMeServicesonLoginSuccess 
    • setMatchingAlgorithm

      public void setMatchingAlgorithm(TokenBasedRememberMeServices.RememberMeTokenAlgorithm matchingAlgorithm)
      トークン署名の照合に使用するアルゴリズムを設定します
      パラメーター:
      matchingAlgorithm - マッチングアルゴリズム
      導入:
      5.8
    • calculateLoginLifetime

      protected int calculateLoginLifetime(jakarta.servlet.http.HttpServletRequest request, Authentication authentication)
      新しく生成された Remember-Me ログインの有効期間を秒単位で計算します。この期間 (現在の時刻から) が経過すると、Remember-Me ログインは期限切れとみなされます。このメソッドでは、ログインで提供されるリクエストパラメーターまたは Authentication オブジェクト内の情報に基づいてカスタマイズできます。デフォルト値は、トークンの有効期間プロパティ tokenValiditySeconds のみです。

      返された値は、トークンの有効期限を計算するために使用され、Cookie の maxAge プロパティを設定するためにも使用されます。

      SEC-485 を参照してください。

      パラメーター:
      request - リクエストは onLoginSuccess に渡されました
      authentication - 成功した認証オブジェクト。
      戻り値:
      秒単位の寿命。
    • retrieveUserName

      protected StringSE retrieveUserName(Authentication authentication)
    • retrievePassword

      protected StringSE retrievePassword(Authentication authentication)