2011-01-24 19 views
9

例外を404ページにマッピングすると、Spring Securityタグはセキュリティコンテキストから認証情報を見つけることができません。 「本当の」404で、認証が見出される。Spring Security taglibsを使用中に404ページに例外をマッピング

私のweb.xml:JSPオン

<error-page> 
    <exception-type>com.example.NotFoundException</exception-type> 
    <location>/app/404</location> 
</error-page> 

<error-page> 
    <error-code>404</error-code> 
    <location>/app/404</location> 
</error-page> 

私が持っている:

<sec:authorize access="hasRole('ROLE_USER')"> 
    <%-- Show navigation links --%> 
</sec:authorize> 
<sec:authorize access="isAnonymous()"> 
    <%-- Show login form --%> 
</sec:authorize> 

/app/404パスがちょうどビューを返しコントローラにマッピングされています。 /foo/some_invalid_idを参照すると、コントローラからNotFoundExceptionがスローされ、最終的にJSPに行くとSecurityContextで認証が見つからず、2つのオプションのどちらもレンダリングされません。代わりに、私が/something_that_really_doesnt_existにブラウズしているとき、私がログインしているかどうかを把握して、適切なHTMLをレンダリングすることができます。

+0

これはおそらくhttp://stackoverflow.com/questions/4153438/spring-security-issue-with-404-errorに役立ちます –

+0

ありがとうございますが、それは私を助けませんでした。 – hleinone

答えて

17

は、あなたの春のセキュリティフィルタマッピングに次の2つのディスパッチャの要素を追加します。デフォルトでは

<filter-mapping> 
    ... 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

は唯一の普通の要求は、定義されたフィルタマッピングを通過します。

「INCLUDE」と「FORWARD」は、2つの有効なディスパッチャ要素の値です。

+1

私のサーブレット/ JSPの無知を許しますが、例えば404が発生した場合、そのリクエストは通常​​、Spring Securityフィルタ(またはそれに関するフィルタ)を経由してルーティングされません。それは完璧な意味合いがあります。私はちょうど私がここで何が起こっているのか理解していることを確認したい。 –

+0

あなたの言ったことは正しいです。件名の詳細については、[こちら](http://www.javaworld.com/jw-03-2003/jw-0328-servlet.html?page=3)をクリックしてください。 – applejack42

+0

クール、ありがとう。 :) –

0

例外処理中にコードの一部のコンポーネントがHttpSession.invalidate()を呼び出している可能性が最も高いケースです。簡単なデバッグでこれを簡単に見つけることができます。

しかし、実際にはisAnonymous()をチェックする必要はありません - 持っていないユーザーをチェックするために十分であるROLE_USER権限:

  • 春のセキュリティ2:あなたは<sec:authorize>タグのareNotGranted属性を使用することができます(参照春のセキュリティ3ではSpring Security 2 documentation
  • :あなたが否定的条件の評価のための春ELを使用することができます。access="!hasRole('ROLE_USER')"
+0

私はSpring Security 3を使用していますので、否定を使用することができますが、適切なデータが存在しないため、ログインしていてもログインフォームが表示されると思います。 – hleinone

+0

セッションの無効化の時点で、私は3回しか見つかりませんでしたが、例外がスローされたときに呼び出されたセッションはありませんでした。 – hleinone

+0

現在の設定JSPページがレンダリングされ(ログインページではなく)レンダリングされている場合は、否定によって解決策が提供されます。 JSPページがレンダリングされておらず、代わりにログインページが表示されている場合(ユーザーがシステムにログインでき、ある時点でSecurityContextを通じて有効な認証オブジェクトにアクセス可能であると仮定) - セキュリティコンテキストをクリアしているか確認する –

関連する問題