跳到主要内容

10、处理登出

当使用WebSecurityConfigurerAdapter时注销功能会被自动运用上,默认是通过访问/logout这个URL将用户登出,该操作执行以下动作:

  • 使Session无效
  • 清除所有已经配置的RememberMe认证
  • 清除SecurityContextHolder
  • 跳转到/login?success

和登录功能类似,你也有不同的选项来定制你的注销功能。

protected void configure(HttpSecurity http) throws Exception { 
    http 
        .logout()  // 1 
            .logoutUrl("/my/logout")// 2 
            .logoutSuccessUrl("/my/index") // 3 
            .logoutSuccessHandler(logoutSuccessHandler)//4 
            .invalidateHttpSession(true)  // 5 
            .addLogoutHandler(logoutHandler) // 6 
            .deleteCookies(cookieNamesToClear) //7 
            .and() 
        ... 
} 

1、 提供注销支持,使用WebSecurityConfigurerAdapter.是会自动被应用;
2、 设置触发注销操作的URL(默认是logout),如果CSRF保护被启用(默认是启用的)的话这个请求的方式被限定为POST.请查阅javaDoc相关信息;
3、 注销之后跳转的URL.默认是/login?logout,具体查看JaveDoc文档;
4、 让你设置定制的LogoutSuccessHandler,如果指定了这个选项那么logoutSuccessUrl()的设置会被忽略,请查阅JavaDoc文档;
5、 指定是否在注销时让HttpSession无效默认设置为true,在内部配置SecurityContextLogoutHandler选项请参阅JavaDoc;
6、 添加一个logoutHandler,默认SecurityContextLogoutHandler会被添加为最后一个logoutHandler.;
7、 允许指定在注销成功时将移除的cookie.这是一个显示的添加一个CookieClearingLogoutHandler的快捷方式;

注销也可以通过XML命名空间进行配置,请参阅Spring Security XML命令空间相关文档获取更多细节。

一般来说,为了定制注销功能,你可以添加LogoutHandler以及LogoutSuccessHandler的实现。对于许多常见场景,当使用流式API时,这些处理器会在幕后进行添加。

LogoutHandler

一般来说,LogoutHandler的实现类可以参与到注销处理中。他们被用来执行必要的清理,因而他们不应该抛出错误,我们提供各种实现:

请查看“Remember-Me接口和实现”获取详情。

流式API提供了调用相应的LogoutHandler实现的快捷方式,而不用直接提供LogoutHandler的实现。例如:deleteCookies() 允许指定注销成功时要删除的一个或者多个cookie.这是一个添加CookieClearingLogoutHandler的快捷方式。

LogoutSuccessHandler

LogoutSuccessHandlerLogoutFiler在成功注销后调用,用来进行重定向或者转发相应的目的地。注意这个接口与LogoutHandler几乎一样,但是可以抛出异常。

下面是提供的一些实现:

和前面提到的一样,你不需要直接指定SimpleUrlLogoutSuccessHandler.而使用流式API通过设置logoutSuccessUrl()快捷的进行设置。这样会隐式的设置SimpleUrlLogoutSuccessHandler. 注销成功后将重定向到设置的URL地址。默认的地址是/login?logout.

在REST API场景中HttpStatusReturningLogoutSuccessHandler 会进行一些有趣的改变。LogoutSuccessHandler允许你设置一个返回给客户端的HTTP状态码(默认返回200)来替换重定向到URL这个动作.

进一步的注销相关的参考(TODO)

  • 处理注销
  • 测试注销
  • HttpServletRequest.logout()
  • 章节 “Remember-Me 接口和实现”
  • 注销的CSRF说明
  • 单点注销(CAS协议)
  • 注销的XML命名空间章节