Spring Boot退出登录注意点


退出登录Loginout是任何安全应用程序不可或缺的一部分。注销确保客户执行退出后,所有敏感信息都将被删除或失效。Spring Security在会话中存储认证信息。Spring Security为应用程序自动处理以下任务。

  1. 使HTTP会话无效。
  2. 清理所有RememberMe身份验证配置。
  3. 清除SecurityContextHolder。
  4. 将用户重定向到配置的页面。

在本文中,我们将使用spring boot来检查注销功能。
GitHub存储库下载完整的应用程序。
由于Spring安全性将在注销过程中处理大部分繁重的工作,因此我们只需要为扩展WebSecurityConfigurerAdapter的自定义安全性配置类配置一些细节。这是启用logout注销功能的基本配置:
protected void configure(HttpSecurity http) throws Exception {
    http
        .logout(logout -> logout                                                                              
        );
}

启用注销功能时,我们应牢记以下几点:
  1. 成功注销后,默认情况下,客户将重定向到/login?logout。Spring安全性提供了更改URL的灵活性。
  2. 如果CSRF保护处于活动状态(默认),Spring Security希望注销请求必须是POST类型,我们可以GET通过禁用CSRF保护来使用注销请求。

如果您需要对登出流程进行更多控制,以下是完整的参考:
protected void configure(HttpSecurity http) throws Exception {
    http
        .logout(logout -> logout                                                
            .logoutUrl("/my/logout")                                            
            .logoutSuccessUrl(
"/home")                                      
            .logoutSuccessHandler(logoutSuccessHandler)                         
            .invalidateHttpSession(true)                                        
            .addLogoutHandler(logoutHandler)                                    
            .deleteCookies(cookieNamesToClear)                                  
        )
}

  • logoutSuccessURL–帮助将用户重定向到登录页面登出,默认值为默认值/login?logout(在本例中,我们将重定向到主页)。
  • logoutSuccessHandler–处理程序,在注销完成后触发。我们可以使用它来处理重定向或转发到目的地。请注意,如果我们配置logoutSuccessHandler,logoutSuccessUrl()将会忽略。
  • invalidateHttpSession–控制HTTP会话是否应该无效。默认值是true。
  • deleteCookies–删除所有安全cookie(以防我们在登录时进行设置。)

要自定义注销功能,可以通过添加LogoutHandler和/或LogoutSuccessHandler实现。
 
Logout注销用户界面
我们需要为客户提供选择,以单击注销logout链接。Spring Security提供了以下2个选项:
  1. 执行POST注销(这是默认设置,建议这样做)。
  2. 通过禁用CSRF功能执行GET注销。

如果您无法执行POST请求并希望回退到GET注销请求,则需要在应用程序中进行以下更改。
  1. 禁用CSRF。
  2. 将POST请求转换为UI上的GET。

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
    ...
}