对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

本节介绍如何自定义注销的处理。Spring中文文档

注销 Java/Kotlin 配置

使用 Bean 时,会自动应用注销功能。 默认情况下,访问 URL 会通过以下方式注销用户:HttpSecurity/logoutSpring中文文档

但是,与配置登录功能类似,您还可以使用各种选项来进一步自定义注销要求:Spring中文文档

注销配置
public SecurityFilterChain filterChain(HttpSecurity http) {
    http
        .logout(logout -> logout                                                (1)
            .logoutUrl("/my/logout")                                            (2)
            .logoutSuccessUrl("/my/index")                                      (3)
            .logoutSuccessHandler(logoutSuccessHandler)                         (4)
            .invalidateHttpSession(true)                                        (5)
            .addLogoutHandler(logoutHandler)                                    (6)
            .deleteCookies(cookieNamesToClear)                                  (7)
        )
        ...
}
open fun filterChain(http: HttpSecurity): SecurityFilterChain {
    http {
        logout {                                                  (1)
            logoutUrl = "/my/logout"                              (2)
            logoutSuccessUrl = "/my/index"                        (3)
            logoutSuccessHandler = customLogoutSuccessHandler     (4)
            invalidateHttpSession = true                          (5)
            addLogoutHandler(logoutHandler)                       (6)
            deleteCookies(cookieNamesToClear)                     (7)
        }
    }
    // ...
}
1 提供注销支持。
2 触发注销发生的 URL(默认值为 )。 如果启用了 CSRF 保护(默认值),则请求也必须是 POST。 有关更多信息,请参阅 logoutUrl(java.lang.String logoutUrl)。/logout
3 注销后要重定向到的 URL。 默认值为 。 有关更多信息,请参阅 logoutSuccessUrl(java.lang.String logoutSuccessUrl)。/login?logout
4 让我们指定一个自定义 . 如果指定了此项,则忽略此项。 有关详细信息,请参阅 LogoutSuccessHandlerLogoutSuccessHandlerlogoutSuccessUrl()
5 指定是否在注销时使 失效。 默认情况下,这是 true 的。 配置底盖。 有关详细信息,请参阅 invalidateHttpSession(boolean invalidateHttpSession)。HttpSessionSecurityContextLogoutHandler
6 添加 . 默认情况下,添加为最后一个 .LogoutHandlerSecurityContextLogoutHandlerLogoutHandler
7 让我们在注销成功时删除指定 cookie 的名称。 这是显式添加的快捷方式。CookieClearingLogoutHandler

还可以使用 XML 命名空间表示法配置注销。 有关更多详细信息,请参阅 Spring Security XML 命名空间部分中 logout 元素的文档。Spring中文文档

通常,要自定义注销功能,可以添加 或 实现。 对于许多常见方案,这些处理程序应用在 涵盖使用 Fluent API 时的情况。LogoutHandlerLogoutSuccessHandlerSpring中文文档

1 提供注销支持。
2 触发注销发生的 URL(默认值为 )。 如果启用了 CSRF 保护(默认值),则请求也必须是 POST。 有关更多信息,请参阅 logoutUrl(java.lang.String logoutUrl)。/logout
3 注销后要重定向到的 URL。 默认值为 。 有关更多信息,请参阅 logoutSuccessUrl(java.lang.String logoutSuccessUrl)。/login?logout
4 让我们指定一个自定义 . 如果指定了此项,则忽略此项。 有关详细信息,请参阅 LogoutSuccessHandlerLogoutSuccessHandlerlogoutSuccessUrl()
5 指定是否在注销时使 失效。 默认情况下,这是 true 的。 配置底盖。 有关详细信息,请参阅 invalidateHttpSession(boolean invalidateHttpSession)。HttpSessionSecurityContextLogoutHandler
6 添加 . 默认情况下,添加为最后一个 .LogoutHandlerSecurityContextLogoutHandlerLogoutHandler
7 让我们在注销成功时删除指定 cookie 的名称。 这是显式添加的快捷方式。CookieClearingLogoutHandler

还可以使用 XML 命名空间表示法配置注销。 有关更多详细信息,请参阅 Spring Security XML 命名空间部分中 logout 元素的文档。Spring中文文档

注销 XML 配置

该元素添加了对通过导航到特定 URL 注销的支持。 默认注销 URL 为 ,但您可以通过设置属性将其设置为其他 URL。 您可以在命名空间附录中找到有关其他可用属性的详细信息。logout/logoutlogout-urlSpring中文文档

LogoutHandler

通常,实现指示能够参与注销处理的类。 应调用它们来执行必要的清理。 因此,他们应该 不抛出异常。 Spring Security 提供了各种实现:LogoutHandlerSpring中文文档

有关详细信息,请参阅 Remember-Me 接口和实现Spring中文文档

Fluent API 不是直接提供实现,而是提供快捷方式,在后台提供相应的实现。 例如,允许您指定在注销成功时要删除的一个或多个 Cookie 的名称。 与添加 .LogoutHandlerLogoutHandlerdeleteCookies()CookieClearingLogoutHandlerSpring中文文档

LogoutSuccessHandler

在成功注销后由 调用 来处理(例如) 重定向或转发到相应的目标。 请注意,该接口与 几乎相同,但可能会引发异常。LogoutSuccessHandlerLogoutFilterLogoutHandlerSpring中文文档

Spring Security 提供以下实现:Spring中文文档

如前所述,您不需要直接指定。 相反,Fluent API 通过设置 . 这设置了幕后。 注销后,将重定向到提供的 URL。 默认值为 。SimpleUrlLogoutSuccessHandlerlogoutSuccessUrl()SimpleUrlLogoutSuccessHandler/login?logoutSpring中文文档

这在 REST API 类型方案中可能很有趣。 这不会在成功注销时重定向到 URL,而是允许您提供要返回的纯 HTTP 状态代码。 如果未配置,则默认返回状态代码 200。HttpStatusReturningLogoutSuccessHandlerLogoutSuccessHandlerSpring中文文档