使用方法自定义注销

时间:2017-05-03 14:00:56

标签: spring spring-boot spring-security

我正在使用Spring Boot和Spring Security编写一个Web项目。

我想以方法而不是网址/logout注销。例如:一个控制器方法获取一个URL,然后这个方法做一些事情并注销。

我的Spring Security配置:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error").permitAll()
            .and()
        .logout().permitAll();
}

但我不知道如何使用某种方法退出。我应该在SecurityConfig.class做什么?如果没有URL注销方法,我该怎么办?

2 个答案:

答案 0 :(得分:0)

您可以在Controller内创建一个方法,并使用SecurityContextLogoutHandler类的方法注销来注销当前用户。

@RequestMapping(value="/custom-logout", method = RequestMethod.GET)
public String customLogout(HttpServletRequest request, HttpServletResponse response) {
    // Get the Spring Authentication object of the current request.
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    // In case you are not filtering the users of this request url.
    if (authentication != null){    
        new SecurityContextLogoutHandler().logout(request, response, authentication); // <= This is the call you are looking for.
    }
    return "redirect:/login-page";
}

答案 1 :(得分:-1)

.logout()
    .logoutUrl("/logoutUrl")
    .logoutSuccessUrl("/index.html?logout=true")
    .logoutSuccessHandler(logoutHandler)
    .invalidateHttpSession(true)

注销用户即清除SecurityContext,并在成功注销后重定向到页面index.html?logout = true。 您还可以定义实现LogoutHandler的LogoutSuccessHandler,并实现onLogoutSuccess()以为您的用例添加任何post logout逻辑。 Spring提供了很少的LogoutHandler实现,如SecurityContextLogoutHandler,SimpleUrlLogoutSuccessHandler等。在spring security docs中查看更多内容。 invalidateHttpSession(true)使您的httpsession无效。