Spring Security OAuth2.0(10):登出

发布时间:2026/7/20 10:42:37

Spring Security OAuth2.0(10):登出 本章代码已分享至Gitee:https://gitee.com/lengcz/security-spring-boot退出Spring security 默认实现了logout 退出访问/logout 即可直接退出。http://localhost:8080/security-springboot/logout退出后可以通过访问其他url 判断是否退出成功。如何自定义退出在Spring Security中自定义退出Logout功能主要通过配置SecurityConfig中的logout()相关方法实现。以下是详细步骤和示例代码1. 基础配置自定义退出路径和重定向通过LogoutConfigurer配置退出路径、退出成功后的重定向地址及需要清除的凭证如Cookie、SessionConfigurationEnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.logout().logoutUrl(/custom-logout)// 自定义退出请求路径默认/logout.logoutSuccessUrl(/login)// 退出成功后重定向的页面.invalidateHttpSession(true)// 使Session失效默认true.deleteCookies(JSESSIONID)// 删除指定Cookie.and()// ...其他配置如授权、认证等}}2. 添加自定义退出逻辑如日志、业务操作通过addLogoutHandler()或logoutSuccessHandler()实现退出前/后的自定义逻辑http.logout().logoutUrl(/custom-logout).addLogoutHandler(customLogoutHandler())// 退出前执行如清理Token.logoutSuccessHandler(customSuccessHandler())// 退出后处理如返回JSON// 示例自定义LogoutHandler清理用户TokenBeanpublicLogoutHandlercustomLogoutHandler(){return(request,response,authentication)-{// 获取当前用户Token并标记失效需结合具体Token存储方案Stringtokenrequest.getHeader(Authorization);tokenService.invalidateToken(token);};}// 示例自定义LogoutSuccessHandler返回JSON响应BeanpublicLogoutSuccessHandlercustomSuccessHandler(){return(request,response,authentication)-{response.setContentType(application/json;charsetUTF-8);response.getWriter().write({\code\:200, \msg\:\退出成功\});};}3. 集成CSRF保护默认启用退出请求默认需要CSRF Token验证。前端需在退出请求中携带X-CSRF-TOKEN可从Cookie或Meta标签获取或在配置中禁用CSRF不推荐http.csrf().disable()// 禁用CSRF仅测试环境使用注意如果让logout在GET请求下生效必须关闭防止CSRF攻击csrf().disable() 。如果开启了CSRF必须使用post方式请求/logout4. 处理并发会话退出若需强制用户在其他终端的会话退出可结合SessionRegistryAutowiredprivateSessionRegistrysessionRegistry;http.sessionManagement().maximumSessions(1)// 最大会话数.sessionRegistry(sessionRegistry).and().logout().logoutUrl(/custom-logout).logoutSuccessHandler((request,response,authentication)-{// 强制所有会话退出newSecurityContextLogoutHandler().logout(request,response,authentication);sessionRegistry.getAllSessions(authentication.getName(),false).forEach(sessionInformation-sessionInformation.expireNow());})5. 退出时清除自定义安全上下文若使用自定义SecurityContext如存储额外用户信息需在退出时手动清理http.logout().logoutUrl(/custom-logout).addLogoutHandler((request,response,authentication)-{SecurityContextHolder.clearContext();// 清除安全上下文})logoutHandler一般来说LogoutHandler的实现类被用来执行必要的清理因而他们不应该抛出异常。下面是Spring Security提供的一些实现PersistentTokenBasedRememberMeServices 基于持久化token的RememberMe功能的相关清理TokenBasedRememberMeService 基于token的RememberMe功能的相关清理CookieClearingLogoutHandler 退出时Cookie的相关清理CsrfLogoutHandler 负责在退出时移除csrfTokenSecurityContextLogoutHandler 退出时SecurityContext的相关清理常见问题解决退出后仍能访问受保护资源检查是否清除了Session/Cookie或重定向路径是否正确。CSRF Token缺失确保前端退出请求携带有效Token或配置http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())。Token未失效在自定义LogoutHandler中实现Token黑名单机制如Redis存储失效Token。通过以上配置可灵活实现退出路径定制、业务逻辑扩展、会话管理及安全凭证清理。具体实现需结合项目使用的认证方式如Session、JWT、OAuth2调整细节。

相关新闻