Spring Security内置的东西很多,有时候比较方便,但有时候因不了解其内部机制很可能出现一些问题。这里说下Spring Security对登出的支持。
Security默认的登出地址为:/logout
,在登出后会进行如下操作:
- 移除HttpSession
- 清空配置的
RememberMe
认证 - 清空SecurityContextHolder`
- 重定向到
/login?logout
自定义配置
当然除了默认的操作,开发者更希望能自己灵活配置。
http
.logout()
.logoutUrl("/app/logout")
.logoutSuccessUrl("/app/loginpage")
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
}
})
.addLogoutHandler(new LogoutHandler() {
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
}
})
.invalidateHttpSession(true)
.deleteCookies("token_token")
;
- 当启用WebSecurityConfigurerAdapter的时候,logout支持会自动启用
- logoutUrl() 访问那个地址会触发登出逻辑。默认情况下CROS是开启的,另外必须是POST方法
- logoutSuccessUrl() 当登出成功之后,会被重定向到的地址
- logoutSuccessHandler()指定登出成功后的处理,如果指定了这个,那么
logoutSuccessUrl
就不会生效。 - addLogoutHandler 添加登出时的Handler,在访问logout地址时会执行,内部是一个立碑,
SecurityContextLogoutHandler
默认会加到最后, - invalidateHttpSession 在登出后,是否要清空当前session
- deleteCookies 指定要清空的Cookie清明,是
CookieClearingLogoutHandler
的简便写法
LogoutHandler
LogoutHandler 即在程序执行logout时一起参与执行其中的处理逻辑,不能抛出异常,官方默认提供了几个实现。
- PersistentTokenBasedRememberMeServices
- TokenBasedRememberMeServices 移除Token
- CookieClearingLogoutHandler 清楚Cookie
- CsrfLogoutHandler 移除CSRF TOKEN
- SecurityContextLogoutHandler
- HeaderWriterLogoutHandler
LogoutSuccessHandler
在调用完LogoutHandler之后,并且处理成功后调用,可以抛出异常,官方默认提供了两个
- SimpleUrlLogoutSuccessHandler 不需要直接指定,在指定logoutSuccessUrl()会自己使用
- HttpStatusReturningLogoutSuccessHandler 返回登出成功后的状态码
最后
在登出的时候区分是接口登出
还是页面登出
,针对不同的登出做不同的处理。
参考:https://docs.spring.io/spring-security/site/docs/5.2.1.RELEASE/reference/htmlsingle/#ns-logout