4

spring me サービスを使用しています。奇妙な動作が見られます。

私が取っている手順:

  • ユーザー名/パスワードを使用して自分のウェブサイトにログインし、自分を記憶するチェックボックスをオンにします

  • ブラウザーを閉じて新しいブラウザーを開き、新しいブラウザーを開くよりも。技術的には、自動的にログインする必要があります。これも起こっています。を使用してPersistentTokenBasedRememberMeServicesいます。

  • ここで、ブラウザーを再度閉じて、新しいブラウザーを再度開きます。自分の Web サイトにアクセスしようとすると、次の例外が発生します。

        SEVERE: Servlet.service() for servlet [appServlet] in context with path [/Spring-Security] threw exception org.springframework.security.web.authentication.rememberme.CookieTheftException: Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack.
        at org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.processAutoLoginCookie(PersistentTokenBasedRememberMeServices.java:102)
        at org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.autoLogin(AbstractRememberMeServices.java:115)
        at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    

    さらにドリルダウンすると、最後の 2 つのリクエストで、remember me トークンSPRING_SECURITY_REMEMBER_ME_COOKIEの値が

    BUpwUUJ3dGpUcVJjaGpiYXJxcmFkdz09OlBBRlZXbDVnYmZZQjM2RmFYVDNVMXc9PQ

しかし、春は(org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.tokenRepository)をデコードしました

    final String presentedSeries = cookieTokens[0];
    final String presentedToken = cookieTokens[1];

最初のリクエストでは正しく、2 番目のリクエストでは、presentedToken を別のものとしてデコードし、Cookie 盗難例外が発生しました。

これは正しい動作ですか?どうすれば問題を解決できますか?

4

1 に答える 1

0

これとまったく同じ問題がありました。最初のリクエストはトークンと一致し、新しいトークンを作成していましたが、この直後に 2 番目のリクエストが (最初のリクエストと同じトークンで) 到着し、トークンが一致しなくなりました!

最初のリクエストの直後に 2 番目のリクエストが来た理由がわかりませんでした。

結局、私の解決策は、メソッドをサブクラス化PersistentTokenBasedRememberMeServicesしてオーバーライドするprocessAutoLoginCookieことでした。Cookie 盗難の例外のチェックをコメントアウトしただけです(これによりセキュリティ ホールが作成されますが、目的には問題ありませんでした)

より安全なソリューションが必要な場合は、代わりに、提示された最後の 2 つのトークンに一致するロジックを簡単に追加できます。

于 2013-03-06T15:54:07.223 に答える