2017-04-06 11 views
0

私はセキュリティ認証の実装を持つJ2EEアプリケーションを持っています。 この依存モジュールでは、アクセストークンがヌルかどうかがチェックされています。存在する場合、NullPointerExceptionがスローされます。 500エラーページの代わりにjspカスタムページにリダイレクトするために、私のアプリケーションでこの例外を捕捉する必要があります。Spring Security:別のモジュールのセキュリティコールの前にフィルタリングコントロールを追加する方法

ポイントは私のアプリケーションクラスの1つを決して通過しないため、他のものを直接呼び出すアプリケーションではないため例外をキャッチできません。チェーンはSpringセキュリティメカニズムによって処理されるためです。私はLogoutFilterに、SecurityContextPersistenceFilterに、その後、FilterChainProxyに、私はDelegatingFilterProxyに合格することを確認し、この時点で制御は、例外がスローされた依存関係のアプリケーション、上渡しスタックトレースから 。

セキュリティの依存関係を呼び出す前にリダイレクトを制御するために、トークン文字列の予防制御を追加する方法はありますか?

これは最初のステップとして、依存フィルタ(preAuthenticationFilter)を呼び出すためにスプリングを可能にするSpring構成である:

<http auto-config="true" access-denied-page="/500" use-expressions="true"> 
    <custom-filter position="PRE_AUTH_FILTER" ref="preAuthenticationFilter" /> 
    <intercept-url pattern="/portal/**" access="isAuthenticated()" /> 
    <intercept-url pattern="/**" access="permitAll" /> 

    <logout logout-url="/logout" delete-cookies="true" 
     invalidate-session="true" logout-success-url="/logoutsuccess" /> 

    <session-management session-fixation-protection="newSession" /> 
</http> 

編集:ここで定義するBean構成に変更されFilterWrapper:

<bean id="preAuthenticationFilter" class="com.example.FilterWrapper"> 
    <constructor-arg> 
     <bean class="com.example.MyPreAuthenticationFilter" > 
      <property name="authenticationManager" ref="authenticationManager" /> 
      <property name="continueFilterChainOnUnsuccessfulAuthentication" value="false" /> 
      <property name="verifyTokenChanged" value="true" /> 
     </bean> 
    </constructor-arg> 
</beans:bean> 

答えて

1

カスタムフィルタは、NullPointerExceptionをスローしないように修正する必要があります。あなたの投稿から、私はこのフィルタのコードがおそらくあなたのコントロール下にないことに気がついていますが、Springのコンテキストで初期化されていることがわかります。つまり、例外を捕捉するラッパーをいつでも作成できます。

public class FilterWrapper extends OncePerRequestFilter { 
    private final Filter target; 

    public FilterWrapper(Filter target) { 
    this.target = target; 
    } 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
    try { 
     target.doFilter(request, response, filterChain); 
    } catch(NullPointerException e) { 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication token is required"); 
    } 
    } 
} 

ここで、preAuthenticationFilterのBean定義を変更して、元のフィルタの周りにラッパーを使用するようにしてください。どこかの設定ファイル内でこのようなBean定義があるはず

<bean class="com.example.MyPreAuthenticationFilter" id="preAuthenticationFilter" /> 

変更し、その定義に:

<bean class="com.example.FilterWrapper" id="preAuthenticationFilter"> 
    <constructor-arg> 
    <bean class="com.example.MyPreAuthenticationFilter" /> 
    </constructor-arg> 
</bean> 
+0

おかげで、私は私が指定できる/知って見ることができませんFilterWrapperが元のフィルタのラッパーであること – mifert

+0

設定ファイルを更新する方法の詳細については、更新された回答を参照してください。 – marthursson

+0

FilterWrapperでプロパティを設定しようとしています。プロパティは、 "MyPreAuthenticationBean" – marthursson

関連する問題