3

更新:この問題は、使用していた特定のSpringバージョンに関連していると予想していましたが、Robの回答は、おそらく私の環境に固有のものであることを示しています。この特定の問題(ログイン時にセッションを手動でクリアするフィルター)の回避策を見つけたので、Robの回答を正解としてマークしました。


私のSpringアプリケーションでは、ログイン間でセッションが保持されています。ログイン時にセッションをクリアしたいのですが。

Spring Security 2.0.4を使用しています(質問しないでください)。セキュリティ構成は次のようになります。

<security:http ...
session-fixation-protection="newSession">
...
        <security:logout invalidate-session="true" logout-success-url="/login.html" />
</security:http>

私は、 session-fixation-protection="newSession"がユーザーログイン時にセッションをクリアするという印象を受けました。もう1つの興味深い点は、ログアウト時にセッションクリアされるため、invalidate-session="true"が望ましい効果をもたらすことです。

テストするときは、次の方法を使用します。

@RequestMapping(value = "writeSession")
String writeSession(HttpServletRequest request) {
  request.getSession().setAttribute("username", MySecurityService.getLoggedInUsername());
  ...
}

@RequestMapping(value = "readSession")
String readSession(HttpServletRequest request) {
  log.info("Current username: " + request.getSession().getAttribute("username");
  ...
}

その後私は:

  1. user1としてログイン
  2. writeSessionにアクセスします(セッションのユーザー名を「user1」に設定します)
  3. readSessionにアクセスします(ログ出力:現在のユーザー名:user1
  4. user2としてログイン(ログアウトせずに)
  5. readSessionにアクセスします(ログ出力:現在のユーザー名:user1

手順3と4の間にログアウトすると、期待どおりの結果が得られることに注意してください(現在のユーザー名:null

4

1 に答える 1

1

一般的にこれが機能することを示すサンプルを作成しました。実際の例については、この git リポジトリの so-clear-spring-session-on-login ブランチを参照してください。

残りの構成によっては、問題を引き起こす可能性のあることがいくつかあります。

  • Spring Security 構成の残りを共有できますか? たとえば、HTTP と HTTPS を切り替えている場合、使用されているセッションが切り替えられている可能性があります。セッションで何が問題になる可能性があるかについての詳細は、Spring Security FAQを参照してください。

  • MySecurityService の実装はどのようなものですか?

  • あなたの web.xml はどのように見えますか?

于 2013-01-30T00:36:23.427 に答える