春のセキュリティ - タグライブラリとJSPでSecurityContext.authenticationヌルが、コントローラでOK
-
21-09-2019 - |
質問
私は今少しの間、この問題で苦労してきました。それについていくつかの記事を見つけましたが、どれも私の問題を解決していません。これはおそらく、SecurityContextが、特定のスレッドにboudされているという事実とは何かを持っていますが、でも、私はそれを解決する方法がわからない。
でログインしたユーザーを取得するために、次のコードを考えてみましょう
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
コントローラでこのコードを実行すると、ユーザはログイン(正しく)返します。 タグライブラリまたはJSPからこのコードを実行するとNPEがスロー(認証= NULL)。 また、春のタグ(おそらく同じ理由)の の機能しません。
のweb.xmlからのエキスます:
<filter>
<filter-name>AcegiFilter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AcegiFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
春のセキュリティ設定ファイルから抽出します:
<bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
</value>
</property>
</bean>
<bean id="filterSecurityInterceptor"
class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="alwaysReauthenticate" value="true" />
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/myaccount.htm=ROLE_CUSTOMER
</value>
</property>
</bean>
解決
解決済みの
問題は、フィルタ配列から生じたものです。 PageFilter(sitemesh)は春のセキュリティフィルタの前に呼び出されたとこのためのセキュリティコンテキストがまだJSPで使用できませんでした。 web.xml内のフィルタの順序を変更する(セキュリティフィルタは、第1)問題を修正しました。
他のヒント
これは明白な質問のように見えるかもしれませんが、あなたはページ/myaccount.htmにアクセスする前にそれらを任意の時点で(つまり認証)にログインしたユーザを余儀なくされていますか?私は私が尋ねる理由は、あなたのオブジェクト定義のソースの匿名アクセスを必要とログインページにすべてのマッピングを見ていません。認証なしのユーザー缶アクセス/myaccount.htm場合は、何の校長は、彼らがそれ故にページ、あなたのNullPointerExceptionがアクセスした時点でのセキュリティコンテキストで作成されていないでしょう。また、フォームベースの認証を使用していますか? HTTP BASIC認証? Acegiの?
でサポートされている他のいくつかのタイプ