0

Spring Security (3.1) を使用してアプリケーションを開発していますが、次の問題が発生しました。ユーザーがログアウトするときに、安全なページからログアウトするかどうかに応じて、カスタム URL にリダイレクトしたいと考えています。次のようなカスタム LogoutHandler を作成しました。

@Override
public void onLogoutSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication)
        throws IOException, ServletException {


    String refererUrl = request.getHeader("Referer");
    if (requiredAuthentication(refererUrl, authentication)) {
        response.sendRedirect(request.getContextPath());
    } else {
        response.sendRedirect(refererUrl);
    }
}

private boolean requiredAuthentication(String url, Authentication authentication){
    return !getPrivilegeEvaluator().isAllowed(url, authentication);
}

したがって、ユーザーが非セキュア ページからログアウトすると、ログアウトされて同じ URL にリダイレクトされます。セキュア ページからログアウトすると、インデックス ページに移動します。問題は、メソッドに渡される Authentication オブジェクトが常に認証されることです (ただし、仕様によれば、メソッドはユーザーのログアウト後に呼び出されます)。私のセキュリティコンテキスト:

<http use-expressions="true" disable-url-rewriting="true" request-matcher-ref="requestMatcher" >


    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="https" />
    <intercept-url pattern="/dashboard/**" access="hasRole('ROLE_OWNER')" requires-channel="https" />
    <intercept-url pattern="/**" access="permitAll"/>

    <form-login login-page="/login"
                authentication-success-handler-ref="successHandler"
                authentication-failure-url="/login"
                login-processing-url="/validate"  />

    <logout logout-url="/logout" invalidate-session="true" success-handler-ref="logoutSuccessHandler" />

    <remember-me services-ref="rememberMeServices" key="KEY"  use-secure-cookie="false" />

    <session-management session-fixation-protection="migrateSession">
        <concurrency-control max-sessions="1" />
    </session-management>

</http>

logoutSuccessHandler に gettig するときに、受信した認証がまだ有効である理由はわかりますか? フィールドが最終的なため、このオブジェクトを編集できません (isAuthenticated を除きますが、isAllowed() メソッドによってチェックされません..)

4

1 に答える 1

3

Spring Security ソース コードを見ると、LogoutFilter は SecurityContextHolder から Authentication オブジェクトを取得し、それをローカル変数に保持し、SecurityContextLogoutHandler を介してホルダーから削除します。すべての LogoutHandlers が呼び出された後、LogoutSuccessHandler を呼び出し、Authentication オブジェクトを渡します。

有効とは言ってもSecurityContextHolderにはもうないので、Springの場合、ユーザーはログアウトされます。

于 2012-07-16T13:01:35.507 に答える