Spring Security处理登出(Logout)

Spring Security内置的东西很多,有时候比较方便,但有时候因不了解其内部机制很可能出现一些问题。这里说下Spring Security对登出的支持。

Security默认的登出地址为:/logout,在登出后会进行如下操作:

  • 移除HttpSession
  • 清空配置的RememberMe认证
  • 清空SecurityContextHolder`
  • 重定向到/login?logout

自定义配置

当然除了默认的操作,开发者更希望能自己灵活配置。

Spring Security处理登出(Logout)_第1张图片
image-20191126072854286
      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

你可能感兴趣的:(Spring Security处理登出(Logout))