4

我正在阅读许多教程,但没有一个对我有用……我将 Spring 3.1.x 与 Spring Security 一起使用。我有一堆安全的 url 和许多不安全的。现在,当用户登录并尝试注销时,我希望他保持与以前相同的页面,所以我使用这个:

<beans:bean id="logoutSuccessHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler">
    <beans:property name="useReferer" value="true"/>
</beans:bean>

这很好用,但是当用户从安全页面注销时,它会将他重定向到登录页面,我想重定向到主页.. 我怎样才能做到这一点?提前致谢!

4

3 回答 3

7

由于您有自定义的重定向逻辑,因此您需要一个自定义的LogoutSuccessHandler. 在此处理程序中,您需要添加以下逻辑:

String refererUrl = request.getHeader("Referer");
String normalizedRefererUrl = ...; // "Normalize" (if needed) the URL so it is in the form that you need.

if (requiresAuthentication(normalizedRefererUrl, authentication)) {
    response.sendRedirect(request.getContextPath()); // home page
} else {
    response.sendRedirect(refererUrl); // or normalizedUrl
}

在您的requiresAuthentication()方法中,您需要使用 Spring Security 的某些部分来确定 URL 是否需要身份验证。
您可以在那里使用WebInvocationPrivilegeEvaluator参考。您可以通过 Spring 通过按类自动装配来掌握它(因为将有一个 bean 实现WebInvocationPrivilegeEvaluator)。
评估器有一种方法可供您使用,isAllowed(uri, authentication).

于 2012-07-12T16:02:06.683 回答
4
<security:http auto-config="true">
    <security:form-login login-page="/spring/login" 
                         login-processing-url="/spring/loginProcess"
                         default-target-url="/spring/main" 
                         authentication-failure-url="/spring/login?login_error=1" />  
    <security:logout logout-url="/spring/logout" logout-success-url="/spring/logout-success" />
</security:http>

来自文档自定义 succeshandler的logout-success-url

于 2012-07-12T15:20:40.433 回答
0

根据spring security的文档,如果你没有指定 logout-success-url 那么它应该重定向 /. 检查此配置,您可能可以使用 SimpleRedirectInvalidSessionStrategy

于 2012-07-12T15:27:29.210 回答