对于最新的稳定版本,请使用 Spring Security 6.5.3! |
处理注销
本节介绍如何自定义注销处理。
注销 Java/Kotlin 配置
使用HttpSecurity
bean,注销功能会自动应用。
默认情况下,访问 URL/logout
通过以下方式将用户注销:
-
使 HTTP 会话失效
-
清理已配置的任何 RememberMe 身份验证
-
清除
SecurityContextHolder
-
清除
SecurityContextRepository
-
重定向到
/login?logout
但是,与配置登录功能类似,您还可以选择各种选项来进一步自定义注销要求:
-
Java
-
Kotlin
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(默认值为/logout ).
如果启用了 CSRF 保护(默认值),则请求也必须是 POST。
有关更多信息,请参阅logoutUrl(java.lang.String logoutUrl) . |
3 | 注销后要重定向到的 URL。
默认值为/login?logout .
有关更多信息,请参阅logoutSuccessUrl(java.lang.String logoutSuccessUrl) . |
4 | 让我们指定自定义LogoutSuccessHandler .
如果指定了这一点,logoutSuccessUrl() 被忽略。
有关更多信息,请参阅LogoutSuccessHandler . |
5 | 指定是否使HttpSession 注销时。
默认情况下,这是正确的。
配置SecurityContextLogoutHandler 在被窝里。
有关更多信息,请参阅invalidateHttpSession(boolean invalidateHttpSession) . |
6 | 添加一个LogoutHandler .
默认情况下,SecurityContextLogoutHandler 添加为最后一个LogoutHandler . |
7 | 让我们指定在注销成功时删除 cookie 的名称。
这是添加CookieClearingLogoutHandler 明确地。 |
还可以使用 XML 命名空间表示法来配置注销。 有关更多详细信息,请参阅 Spring Security XML 命名空间部分中注销元素的文档。 |
通常,要自定义注销功能,您可以添加LogoutHandler
或LogoutSuccessHandler
实现。
对于许多常见方案,这些处理程序应用于
涵盖使用 Fluent API 时。
注销 XML 配置
这logout
元素添加了对通过导航到特定 URL 注销的支持。
默认注销 URL 为/logout
,但您可以通过将logout-url
属性。
您可以在命名空间附录中找到有关其他可用属性的详细信息。
注销处理程序
一般LogoutHandler
实现表示能够参与注销处理的类。
应调用它们来执行必要的清理。
因此,他们应该
不抛出异常。
Spring Security 提供了各种实现:
有关详细信息,请参阅 Remember-Me 接口和实现。
而不是提供LogoutHandler
直接实现,Fluent API 还提供了快捷方式,这些快捷方式提供了相应的LogoutHandler
幕后实施。
例如deleteCookies()
允许您指定注销成功时要删除的一个或多个 Cookie 的名称。
与添加CookieClearingLogoutHandler
.
LogoutSuccessHandler
这LogoutSuccessHandler
在成功注销后被调用LogoutFilter
,以处理(例如)
重定向或转发到适当的目的地。
请注意,该接口与LogoutHandler
但可能会引发异常。
Spring Security 提供以下实现:
-
HttpStatusReturningLogoutSuccessHandler
如前所述,您无需指定SimpleUrlLogoutSuccessHandler
径直。
相反,Fluent API 通过设置logoutSuccessUrl()
.
这会设置SimpleUrlLogoutSuccessHandler
在被窝里。
注销后,提供的 URL 将重定向到。
默认值为/login?logout
.
这HttpStatusReturningLogoutSuccessHandler
在 REST API 类型方案中可能很有趣。
成功注销后,此 URL 不是重定向到 URLLogoutSuccessHandler
允许您提供要返回的纯 HTTP 状态代码。
如果未配置,则默认返回状态代码 200。