web-dev-qa-db-ja.com

複数回呼び出されるSpringセキュリティカスタムフィルター

6回というカスタムログアウトフィルターがあります。アプリケーションにアクセスしようとするとすぐに2回、ユーザー名/パスワードを入力して[ログイン]をクリックしたときに2回、[ログアウト]をクリックしたときにもう一度2回。

私は何が間違っているのですか?

構成:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN_FUNCTIONS')" />      
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />

    <form-login login-page="/login"
        authentication-success-handler-ref="customAuthenticationSuccessHandlerBean"
        authentication-failure-handler-ref="customAuthenticationFailureHandlerBean" />
    <logout invalidate-session="true" success-handler-ref="logoutHandlerBean" />
    <session-management session-fixation-protection="migrateSession">
        <concurrency-control max-sessions="1"
            expired-url="/login_sessionexpired" />
    </session-management>

    <custom-filter before="LOGOUT_FILTER" ref="customLogoutFilter" />
</http>

<beans:bean id="customLogoutFilter" class="com.hurontg.libms.security.CustomLogoutFilter" />

フィルター:

public class CustomLogoutFilter extends OncePerRequestFilter {
/**
 * 
 */
private XLogger logger = XLoggerFactory
        .getXLogger(CustomLogoutFilter.class.getName());

@Override
protected void doFilterInternal(HttpServletRequest req,
        HttpServletResponse res, FilterChain chain)
        throws ServletException, IOException {

    logger.error("========================================================================================");
    logger.error("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Custom Logout Filter $$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    logger.error("========================================================================================");

    chain.doFilter(req, res);
}

}

Springバージョン:4.1.1 Springセキュリティ:3.2.5

10
kmansoor

要求されている他のURLに対して呼び出される可能性があります。たとえば、ページに読み込まれるcss、javascript、画像がある場合、それらのそれぞれに対して呼び出されます。現在のリクエスト情報を表示するロギングステートメントを追加して、それが当てはまるかどうかを確認してください。例えば、

logger.error("URL = " + req.getRequestURL());
4
Rob Winch

Spring Bootを使用している場合、コンテキスト内の GenericFilterBean (OncePerRequestFilterは1つ)はフィルターチェーンに自動的に追加されます。上記の構成では、同じフィルターが2回含まれます。

これに対する最も簡単な回避策は、コンテキストで FilterRegistrationBean を定義し、それを無効にすることです。

<beans:bean id="customLogoutFilterRegistration" class="org.springframework.boot.context.embedded.FilterRegistrationBean">
    <beans:property name="filter" ref="customLogoutFilter"/>
    <beans:property name="enabled" value="false"/>
</beans:bean>
25
mikeapr4

私のケースを共有するだけです:(

AuthenticationProviderでauthentication.setAuthenticated(true)を設定していませんでした。

したがって、AbstractPreAuthenticatedProcessingFilterauthenticateを一度呼び出した後、AbstractSecurityInterceptorauthenticateIfNeededを呼び出していました。

0
jrhee17