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() メソッドによってチェックされません..)