【问题标题】:Spring Security custom LogoutSuccessHandler gets strange Authentication objectSpring Security 自定义 LogoutSuccessHandler 获取奇怪的 Authentication 对象
【发布时间】:2012-07-15 05:24:06
【问题描述】:

我正在使用 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>

你有什么想法,为什么收到的身份验证仍然有效,当 gettig 到 logoutSuccessHandler 时?我不能编辑这个对象,因为它的字段是最终的(除了 isAuthenticated,但它没有被 isAllowed() 方法检查..)

【问题讨论】:

    标签: spring spring-mvc spring-security logout


    【解决方案1】:

    查看 Spring Security 源代码,LogoutFilter 从 SecurityContextHolder 获取 Authentication 对象,将其保存在本地变量中,并通过 SecurityContextLogoutHandler 将其从持有者中删除。在调用所有 LogoutHandlers 之后,它会调用您的 LogoutSuccessHandler,并传递 Authentication 对象。

    即使它说它是有效的,它也不再存在于 SecurityContextHolder 中,因此对于 Spring,用户已注销。

    【讨论】:

    • 是的,我已经检查了源,所以 LogoutSuccessHandler 从注销之前获取 Authentication 对象,这就是它拥有所有授权等的原因。我向您保证,如果您在 LogoutSuccessHandler 内部使用 Authentication isAllowed() 它将返回 true,并且逻辑上认为它应该返回 false(因为我们已经注销了..)。我以其他方式解决了我的问题,但你写的是正确的,所以我标记为已回答:)
    猜你喜欢
    • 2018-01-29
    • 2017-11-21
    • 2013-05-03
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多