# 处理注销

# 注销 爪哇/ Kotlin 配置

当使用[WebSecurityConfigurerAdapter](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html)时,将自动应用注销功能。默认情况下,访问 URL/logout将通过以下方式将用户注销:

  • 使 HTTP会话无效

  • 清除所有已配置的 RememberMe 身份验证

  • 清除SecurityContextHolder

  • 重定向到/login?logout

然而,与配置登录功能类似,你还可以使用各种选项来进一步定制你的注销需求:

例 1。注销配置

Java

protected void configure(HttpSecurity http) throws Exception {
    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)
        )
        ...
}

Kotlin

override fun configure(http: HttpSecurity) {
    http {
        logout {
            logoutUrl = "/my/logout"                              (1)
            logoutSuccessUrl = "/my/index"                        (2)
            logoutSuccessHandler = customLogoutSuccessHandler     (3)
            invalidateHttpSession = true                          (4)
            addLogoutHandler(logoutHandler)                       (5)
            deleteCookies(cookieNamesToClear)                     (6)
        }
    }
}
1 提供注销支持。
当使用WebSecurityConfigurerAdapter时,会自动应用此功能。
2 触发注销发生的 URL(默认值是/logout)。
如果启用了 CSRF 保护(默认值),那么请求也必须是 POST。
有关更多信息,请咨询Javadoc (opens new window)
3 发生注销后要重定向到的 URL。
默认值为/login?logout
有关更多信息,请咨询Javadoc (opens new window)
4 让我们指定一个自定义LogoutSuccessShandler
如果指定了这个,logoutSuccessUrl()将被忽略。
有关更多信息,请咨询Javadoc (opens new window)
5 指定是否在注销时使HttpSession无效。
默认情况下这是true
配置了封面下的SecurityContextLogouthandler
有关更多信息,请咨询Javadoc (opens new window)
6 添加LogoutHandler。默认情况下,SecurityContextLogoutHandler是作为最后一个LogoutHandler添加的。
7 允许指定注销成功后要删除的 cookie 的名称。
这是显式添加CookieClearingLogoutHandler的快捷方式。
当然,也可以使用 XML 命名空间符号来配置注销。
请参阅 Spring Security XML 命名空间小节中注销元素的文档以获取更多详细信息。

通常,为了定制注销功能,可以添加[LogoutHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutHandler.html)和/或[LogoutSuccessHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutSuccessHandler.html)实现。对于许多常见的场景,在使用 Fluent API 时,这些处理程序会被隐藏起来。

# 注销 XML 配置

logout元素通过导航到特定的 URL,增加了对注销的支持。默认的注销 URL 是/logout,但你可以使用logout-url属性将其设置为其他内容。有关其他可用属性的更多信息,请参见名称空间附录。

# LogoutHandler

通常,[LogoutHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutHandler.html)实现表示能够参与注销处理的类。预计将调用它们来执行必要的清理。因此,他们不应该抛出例外。提供了各种实现方式:

详情请见Remember-Me 接口和实现

与其直接提供LogoutHandler实现,Fluent API 还提供了一些快捷方式,这些快捷方式在封面下提供了相应的LogoutHandler实现。例如:deleteCookies()允许指定注销成功后要删除的一个或多个 Cookie 的名称。与添加CookieClearingLogoutHandler相比,这是一个快捷方式。

# LogoutSuccessHandler

LogoutSuccessHandlerLogoutFilter成功注销后调用LogoutSuccessHandler,以处理例如重定向或转发到适当的目的地。请注意,该接口几乎与LogoutHandler相同,但可能会引发异常。

提供了以下实现方式:

如上所述,你不需要直接指定SimpleUrlLogoutSuccessHandler。相反,Fluent API 通过设置logoutSuccessUrl()提供了一个快捷方式。这将在封面下设置SimpleUrlLogoutSuccessHandler。注销发生后,提供的 URL 将被重定向到该 URL。默认值为/login?logout

在 REST API 类型场景中,HttpStatusReturningLogoutSuccessHandler可能很有趣。这LogoutSuccessHandler不是在成功注销后重定向到 URL,而是允许你提供一个要返回的普通 HTTP 状态代码。如果未配置状态代码 200,将在默认情况下返回。

# 更多与注销相关的参考资料

Run-As认证事件