Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Java 在CustomLogoutSuccessHandler中,身份验证对象始终为null_Java_Spring_Spring Security - Fatal编程技术网

Java 在CustomLogoutSuccessHandler中,身份验证对象始终为null

Java 在CustomLogoutSuccessHandler中,身份验证对象始终为null,java,spring,spring-security,Java,Spring,Spring Security,我的自定义logoutSuccesshandler中的身份验证对象总是为null,我不确定问题出在哪里:( 以下是spring安全文件: <sec:http auto-config="true" entry-point-ref="ssoProcessingFilterEntryPoint" access-decision-manager-ref="affirmativeBased"> <sec:intercept-url pattern=

我的自定义logoutSuccesshandler中的身份验证对象总是为null,我不确定问题出在哪里:(

以下是spring安全文件:

    <sec:http auto-config="true" entry-point-ref="ssoProcessingFilterEntryPoint"
        access-decision-manager-ref="affirmativeBased">
        <sec:intercept-url pattern="/afterAuthn/**" access="${spring.security.role}" />
        <sec:intercept-url pattern="/tenancy/**" access="${spring.security.role}" />
        <!-- Add permissions to specific URLS - i.e. IAM.User.Read for /resources/** -->
        <sec:intercept-url pattern="/**"
            access="${default.permission}" />
        <sec:logout invalidate-session="true" delete-cookies="true"
            success-handler-ref="customLogoutSuccessHandler" />
        <sec:custom-filter ref="ssoAuthenticationFilter"
            position="PRE_AUTH_FILTER" />
        <sec:session-management>
            <sec:concurrency-control max-sessions="1" />
        </sec:session-management>
    </sec:http>
..
<bean id="customLogoutSuccessHandler"
        class="usermgmt.service.CustomLogoutSuccessHandler">
         <property name="defaultLogoutSuccessUrl" value="${service.provider.logout.success.url}"/>
    </bean>

在这里,身份验证始终为NULL,Spring安全版本为3.1.0。发布版

这可能是因为您在Spring security中配置了SecurityContextLogoutHandler。SecurityContextLogoutHandler清除安全上下文,从而清除身份验证对象。在ord中,您的自定义处理程序在SecurityContextLogoutHandler之后调用er要保留身份验证对象,您必须创建自定义SecurityContextLogoutHandler,并在其中具有必要的逻辑

在该类中,您有两个选项:

  • 您可以将身份验证对象放入可以在自定义注销成功处理程序中检索的请求属性中
  • 或者在自定义SecurityContextLogoutHandler中计算URL,并将其设置为请求属性。在自定义注销成功处理程序中检索该URL,并将其设置为默认目标URL

  • 这不是正确的行为吗?我的意思是,如果用户自己正确地注销了,身份验证对象应该是空的,因为实际上没有什么可显示的。如果身份验证对象不是空的,这意味着您必须手动取消对用户的身份验证。是的,这是正确的行为,供参考,请检查以下URL:我已经挖掘了一个在代码中输入ile,这并不像我们想象的那么简单。检查Spring Security WEB中的
    LogoutFilter
    类。查看
    doFilter()
    方法,您将看到,获得了身份验证对象,然后将其传递给
    logout()
    方法,最后是您的
    LogoutSuccessHandler
    。这意味着,您的SecurityContext为您提供null而不是身份验证对象(此处不应出现)。您可以调试此方法并找出您的身份验证为空的原因。当我尝试URL示例时,它工作得非常好,但当我尝试与我的应用程序集成时,我得到了空值。因此,我猜,调试是唯一剩下的选项。谢谢。!@Waheed您调试了吗?结果如何?如果您共享您的findi,那将非常好ngs。。。
    public class CustomLogoutSuccessHandler implements LogoutSuccessHandler {
    @Override
        public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
                throws IOException, ServletException {
            if (authentication == null) {
                System.out.println("NULL");
            } else {
                System.out.println("NOT NULL");
            }
    }}