Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Security自定义LogoutSuccessHandler获取奇怪的身份验证对象_Spring_Spring Mvc_Spring Security_Logout - Fatal编程技术网

Spring Security自定义LogoutSuccessHandler获取奇怪的身份验证对象

Spring Security自定义LogoutSuccessHandler获取奇怪的身份验证对象,spring,spring-mvc,spring-security,logout,Spring,Spring Mvc,Spring Security,Logout,我正在使用SpringSecurity(3.1)开发一个应用程序,遇到了以下问题。当用户注销时,我想重定向到某个自定义URL,具体取决于他是否从安全页面注销。我编写了一个自定义LogoutHandler,如下所示: @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)

我正在使用SpringSecurity(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,如果他从安全页面登录ouf,他将转到索引页面。 问题是,该方法的身份验证对象总是经过身份验证的(即使根据规范,在用户注销后调用该方法)。 我的安全环境:

<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时,为什么收到的身份验证仍然有效?我不能编辑这个对象,因为它的字段是最终的(除了isAuthenticated,但它没有被isAllowed()方法检查…)

查看Spring安全源代码,LogoutFilter从SecurityContextHolder获取身份验证对象,将其保留在局部变量上,并将其从holder中删除,通过SecurityContextLogoutHandler。调用所有LogoutHandler后,它将调用LogoutSuccessHandler,并传递身份验证对象


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

查看Spring安全源代码,LogoutFilter从SecurityContextHolder获取身份验证对象,将其保留在局部变量中,并通过SecurityContextLogoutHandler将其从持有者中删除。调用所有LogoutHandler后,它将调用LogoutSuccessHandler,并传递身份验证对象


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

是的,我已经检查了源代码,因此LogoutSuccessHandler在注销之前获取身份验证对象,这就是为什么它拥有所有授权等。。我向您保证,如果您在LogoutSuccessHandler for isAllowed()中使用身份验证,它将返回true,并且逻辑上认为它应该返回false(因为我们已经注销了…)。我用另一种方法解决了我的问题,但是你写的是正确的,所以我标记为回答:)是的,我已经检查了源代码,所以LogoutSuccessHandler在注销之前从中获取身份验证对象,这就是为什么它拥有所有授权等。。我向您保证,如果您在LogoutSuccessHandler for isAllowed()中使用身份验证,它将返回true,并且逻辑上认为它应该返回false(因为我们已经注销了…)。我用另一种方法解决了我的问题,但你写的是正确的,所以我标记为回答:)