Spring Security Java Config自定义注销处理程序不起作用

时间:2015-04-11 22:45:09

标签: java spring spring-mvc spring-security

我已经搜索过一个解决方案,但找不到任何一个,至少不是当前的一个或一个使用非基于xml的Spring和Spring Security配置。

我需要实现一个在spring logout处理程序之前使用的处理程序。我已经阅读了很多关于LogoutSuccessHandler的文章,但是在Logout Filter成功注销后调用了这个文章,我需要访问存储在用户会话中的用户数据来执行一些数据库条目,站点注销信息等。这个会话一旦春天退出用户就会丢失,所以它必须在此之前。

我已经尝试创建自己的自定义注销类,并在我的应用程序配置类中定义它,如下所示:

@Bean
public CustomLogoutHandler customLogoutHandler() {
    return new CustomLogoutHandler();
}

并且我的类扩展了LogoutHandler,就像Spring文档所说的那样:

public class CustomLogoutHandler extends LogoutHandler {

    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        // business logic here
    }
}

这仍然无效。我在代码中放了一个断点,它永远不会被拾取。有没有人知道可能导致这个或我需要做什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:12)

要使用自己的自定义注销处理程序来实现Spring的LogoutHandler.class,您需要让Spring知道您在使用.addLogoutHandler的注销选项下的配置文件中使用自己的。我想你错过了这一步。在安全配置文件中:

public class SecurityConfig extends WebSecurityConfigurerAdapter {  

    ... // Other methods here

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .otherConfigOptions
            .logout()
                .addLogoutHandler(customLogoutHandler())  <- custom handler
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .otherConfigOptions....
    }
}

定义bean,我把它放在SecurityConfig.class中,但我认为你可以将它放在web或app config类中,具体取决于你设置项目的方式。

@Bean
public CustomLogoutHandler customLogoutHandler() {
    return new CustomLogoutHandler();
}

然后,创建CustomLogoutHandler.class,确保实现LogoutHandler并覆盖注销方法。在这里,您可以使用Authentication类访问已添加到用户请求范围的任何内容。

public class CustomLogoutHandler implements LogoutHandler {
    @Override
    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {

        // business logic here
    }
}

您还应该看看这个question and answer,它讨论了Spring中自定义处理程序映射的顺序。

我希望这会有所帮助。