Spring Security OAuth2.0登出的实现
退出
Spring security 默认实现了logout 退出,访问/logout ,即可直接退出。
http://localhost:8080/security-springboot/logout

退出后,可以通过访问其他url 判断是否退出成功。
如何自定义退出
在Spring Security中自定义退出(Logout)功能,主要通过配置SecurityConfig中的logout()相关方法实现。以下是详细步骤和示例代码:
1. 基础配置:自定义退出路径和重定向
通过LogoutConfigurer配置退出路径、退出成功后的重定向地址及需要清除的凭证(如Cookie、Session):
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
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(清理用户Token)
@Bean
public LogoutHandler customLogoutHandler() {
return (request, response, authentication) -> {
// 获取当前用户Token并标记失效(需结合具体Token存储方案)
String token = request.getHeader("Authorization");
tokenService.invalidateToken(token);
};
}
// 示例:自定义LogoutSuccessHandler(返回JSON响应)
@Bean
public LogoutSuccessHandler customSuccessHandler() {
return (request, response, authentication) -> {
response.setContentType("application/json;charset=UTF-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方式请求/logout
4. 处理并发会话退出
若需强制用户在其他终端的会话退出,可结合SessionRegistry:
@Autowired
private SessionRegistry sessionRegistry;
http
.sessionManagement()
.maximumSessions(1) // 最大会话数
.sessionRegistry(sessionRegistry)
.and()
.logout()
.logoutUrl("/custom-logout")
.logoutSuccessHandler((request, response, authentication) -> {
// 强制所有会话退出
new SecurityContextLogoutHandler().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 负责在退出时移除csrfToken
- SecurityContextLogoutHandler 退出时SecurityContext的相关清理
常见问题解决
- 退出后仍能访问受保护资源:检查是否清除了Session/Cookie,或重定向路径是否正确。
- CSRF Token缺失:确保前端退出请求携带有效Token,或配置
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())。 - Token未失效:在自定义
LogoutHandler中实现Token黑名单机制(如Redis存储失效Token)。
通过以上配置,可灵活实现退出路径定制、业务逻辑扩展、会话管理及安全凭证清理。具体实现需结合项目使用的认证方式(如Session、JWT、OAuth2)调整细节。
到此这篇关于Spring Security OAuth2.0登出的实现的文章就介绍到这了,更多相关Spring Security OAuth登出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Springsecurity Oauth2如何设置token的过期时间
- 详解使用Spring Security OAuth 实现OAuth 2.0 授权
- Spring Security OAuth2实现使用JWT的示例代码
- 基于Spring Security的Oauth2授权实现方法
- Spring Security整合Oauth2实现流程详解
- SpringSecurityOAuth2 如何自定义token信息
- SpringSecurity OAuth2单点登录和登出的实现
- SpringBoot的Security和OAuth2的使用示例小结
- Spring Security OAuth过期的解决方法
- Spring Security OAuth2认证授权示例详解
相关文章
CentOS7环境下安装JDK 1.8及解决wget命令缺失问题的办法
在CentOS 7中wget命令是一个非常实用的工具,用于从互联网下载文件,然而默认情况下,wget可能未安装,这篇文章主要介绍了CentOS7环境下安装JDK 1.8及解决wget命令缺失问题的相关资料,需要的朋友可以参考下2025-10-10
IDEA中MAVEN项目总是将LANGUAGE LEVEL重置的问题及解决方案
文章主要介绍了如何在IDEA中配置JDK和LanguageLevel的步骤,包括设置项目SDK、LanguageLevel以及各个模块的LanguageLevel2025-12-12
Caused by: java.lang.ClassNotFoundException: org.apache.comm
这篇文章主要介绍了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07
java算法入门之有效的括号删除有序数组中的重复项实现strStr
大家好,我是哪吒,一个热爱编码的Java工程师,本着"欲速则不达,欲达则欲速"的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程2021-08-08
spring cloud gateway整合sentinel实现网关限流
这篇文章主要介绍了spring cloud gateway整合sentinel实现网关限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-01-01
SpringBoot集成JWT实现Token登录验证的示例代码
随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,本文就来介绍一下SpringBoot集成JWT实现Token登录验证的示例代码,感兴趣的可以了解一下2023-12-12


最新评论