5

私はこの問題を少しでも苦労しています。それについていくつかの記事を見つけましたが、誰も私の問題を解決しませんでした。これはおそらく、SecurityContextが、特定のスレッドにboudであるという事実とは何かを持っていますが、でも、私はそれを解決する方法がわからない:春のセキュリティ - SecurityContext.authenticationはtaglibとjspではnullですが、コントローラではokです

は、ログインしたユーザーを取得するには、次のコードを考えてみましょう

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

コントローラでこのコードを実行すると、ログインしたユーザーが(正しく)返されます。 このコードをtaglibまたは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> 
+0

この条件を生成するサンプルJSPを確認できますか?あなたのページヘッダーにSpring Security taglibをインポートしていますか? – Gandalf

答えて

5

解決済み

問題がフィルタシーケンスから発生しました。 PageFilter(sitemesh)は春のセキュリティフィルタの前に呼び出されました。このため、セキュリティコンテキストはjspではまだ利用できませんでした。 web.xmlのフィルタの順序を変更すると(セキュリティフィルタが最初に)、問題が修正されました。

0

これは明白な質問のように見えるかもしれませんが、あなたは、ログインするユーザーを余儀なくされています(つまり、 )/myaccount.htmページにアクセスする前のどの時点でも認証できますか?オブジェクト定義ソースで匿名アクセスが必要なログインページへのマッピングが表示されませんでした。これが私が尋ねる理由です。ユーザーが認証せずに/myaccount.htmにアクセスできる場合は、ページにアクセスした時点でセキュリティコンテキストにプリンシパルが作成されないため、NullPointerExceptionが発生します。また、フォームベースの認証を使用していますか? HTTPの基本認証? Acegiでサポートされている他のタイプですか?

関連する問題