Logout Java Configuration
当使用WebSecurityConfigurerAdapter时,注销功能被自动应用。默认情况下,访问URL /logout将通过以下方式注销用户。
- 无效的 HTTP Session
- 清理任何已配置的RememberMe认证
- 清除SecurityContextHolder
- 重定向到/login?logout
然而,与配置登录功能类似,也有各种选项来进一步定制你的注销要求:
protected void configure(HttpSecurity http) throws Exception {
http
.logout(logout -> logout
.logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler)
.invalidateHttpSession(true)
.addLogoutHandler(logoutHandler)
.deleteCookies(cookieNamesToClear)
)
...
}
- 提供注销支持。当使用WebSecurityConfigurerAdapter时,这将自动应用
- 触发注销发生的URL(默认为/logout)。如果CSRF保护被启用(默认),那么该请求也必须是POST
- 注销成功后重定向到的URL。默认是/login?logout
- 指定一个自定义的LogoutSuccessHandler。如果指定了这个,logoutSuccessUrl()会被忽略
- 指定是否在注销时使HttpSession失效。这在默认情况下为真。在SecurityContextLogoutHandler中进行配置
- 添加一个LogoutHandler。默认情况下,SecurityContextLogoutHandler被添加为最后一个LogoutHandler
- 允许指定在注销成功时要删除的cookie的名称。这是明确添加CookieClearingLogoutHandler的一个快捷方式
一般来说,为了定制注销功能,你可以添加LogoutHandler和/或LogoutSuccessHandler实现。
LogoutHandler
一般来说,LogoutHandler的实现表示能够参与注销处理的类。它们应该被调用以执行必要的清理工作。因此,它们不应该抛出异常。我们提供了各种实现:
- PersistentTokenBasedRememberMeServices
- TokenBasedRememberMeServices
- CookieClearingLogoutHandler
- CsrfLogoutHandler
- SecurityContextLogoutHandler
- HeaderWriterLogoutHandler
Please see Remember-Me Interfaces and Implementations for details.
API提供了快捷方式来替代LogoutHandler的实现。例如,deleteCookies()允许指定一个或多个cookie的名称,以便在注销成功时被删除。与添加一个CookieClearingLogoutHandler相比,这是一个捷径。
LogoutSuccessHandler
LogoutSuccessHandler在LogoutFilter成功登出后被调用,以处理例如重定向或转发到适当的目的地。请注意,该接口与LogoutHandler几乎相同,但可能会引发一个异常。它的实现有:
- SimpleUrlLogoutSuccessHandler
- HttpStatusReturningLogoutSuccessHandler
如上所述,你不需要直接指定SimpleUrlLogoutSuccessHandler。相反,fluent API通过设置logoutSuccessUrl()提供了一个捷径。这将会设置到SimpleUrlLogoutSuccessHandler的属性上。在注销发生后,将会重定向到所提供的URL,默认是/login?logout。
HttpStatusReturningLogoutSuccessHandler在REST API类型的场景中可能很有趣。这个LogoutSuccessHandler允许你提供一个普通的HTTP状态代码来返回,而不是在成功注销后重定向到一个URL。如果没有配置,默认会返回状态代码200。