我是 码农小胖哥。天天有编程干货分享。觉得写的不错。点个赞,转发一下,关注一下。本文为个人原创文章,转载请注明出处,非法转载抄袭将追究其责任。

1. 前言

上一篇对 Spring Security 所有内置的filter 进行了介绍。今天我们来实战如何安全退出应用程序。

2. 我们使用 Spring Security 登录后都做了什么

这个问题我们必须搞清楚!一般登录后,服务端会给用户发一个凭证。常见有以下的两种:

  • 基于 Session 客户端会存 cookie 来保存一个 sessionId ,服务端存一个 Session 。
  • 基于 token 客户端存一个 token 串,服务端会在缓存中存一个用来校验此 token 的信息。

2. 退出登录需要我们做什么

  1. 当前的用户登录状态失效。这就需要我们清除服务端的用户状态。
  2. 退出登录接口并不是 permitAll, 只有携带对应用户的凭证才退出。
  3. 将退出结果返回给请求方。
  4. 退出登录后用户可以通过重新登录来认证该用户。

3. Spring Security 中的退出登录

接下来我们来分析并实战 如何定制退出登录逻辑。首先我们要了解 LogoutFilter 。

3.1 LogoutFilter

通过 https://www.felord.cn/spring-security-filters.html 我们知道退出登录逻辑是由过滤器 LogoutFilter 来执行的。 它持有三个接口类型的属性:

  1. RequestMatcher logoutRequestMatcher 这个用来拦截退出请求的 URL
  2. LogoutHandler handler 用来处理退出的具体逻辑
  3. LogoutSuccessHandler logoutSuccessHandler 退出成功后执行的逻辑

我们通过对以上三个接口的实现就能实现我们自定义的退出逻辑。

3.2 LogoutConfigurer

我们一般不会直接操作 LogoutFilter ,而是通过 LogoutConfigurer 来配置 LogoutFilter。 你可以通过 HttpSecurity#logout() 方法来初始化一个 LogoutConfigurer 。 接下来我们来实战操作一下。

3.2.1 实现自定义退出登录请求URL

LogoutConfigurer 提供了 logoutRequestMatcher(RequestMatcher logoutRequestMatcher)、logoutUrl(Sring logoutUrl) 两种方式来定义退出登录请求的 URL 。它们作用是相同的,你选择其中一种方式即可。

3.2.2 处理具体的逻辑

默认情况下 Spring Security 是基于 Session 的。LogoutConfigurer 提供了一些直接配置来满足你的需要。如下:

  • clearAuthentication(boolean clearAuthentication) 是否在退出时清除当前用户的认证信息
  • deleteCookies(String... cookieNamesToClear) 删除指定的 cookies
  • invalidateHttpSession(boolean invalidateHttpSession) 是否移除 HttpSession

如果上面满足不了你的需要就需要你来定制 LogoutHandler 了。

3.2.3 退出成功逻辑

  • logoutSuccessUrl(String logoutSuccessUrl) 退出成功后会被重定向到此 URL ,你可以写一个Controller 来完成最终返回,但是需要支持 GET 请求和 匿名访问 。 通过 setDefaultTargetUrl 方法注入到 LogoutSuccessHandler
  • defaultLogoutSuccessHandlerFor(LogoutSuccessHandler handler, RequestMatcher preferredMatcher) 用来构造默认的 LogoutSuccessHandler 我们可以通过添加多个来实现从不同 URL 退出执行不同的逻辑。
  • LogoutSuccessHandler logoutSuccessHandler 退出成功后执行的逻辑的抽象根本接口。

3.3 Spring Security 退出登录实战

现在前后端分离比较多,退出后返回json。 而且只有用户在线才能退出登录。否则不能进行退出操作。我们采用实现 LogoutHandler 和 LogoutSuccessHandler 接口这种编程的方式来配置 。退出请求的 url 依然通过 LogoutConfigurer#logoutUrl(String logoutUrl)来定义。

3.3.1 自定义 LogoutHandler

默认情况下清除认证信息 (invalidateHttpSession),和Session 失效(invalidateHttpSession) 已经由内置的SecurityContextLogoutHandler 来完成。我们自定义的 LogoutHandler 会在SecurityContextLogoutHandler 来执行。

@Slf4j

public class CustomLogoutHandler implements LogoutHandler {

@Override

public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {

User user = (User) authentication.getPrincipal();

String username = user.getUsername();

log.info("username: {} is offline now

springsecurity 不允许session并行登录_Spring Security 实战干货:实现自定义退出登录...相关推荐

  1. Spring Security 实战:实现自定义退出登录

    1. 前言 上一篇对 Spring Security 所有内置的 Filter 进行了介绍.今天我们来实战如何安全退出应用程序. 2. 我们使用 Spring Security 登录后都做了什么 这个 ...

  2. springsecurity 登录失败_Spring Security 实战干货: 401和403状态

    1. 前言 最近几篇我对Spring Security中用户认证流程进行了分析,同时在分析的基础上我们实现了一个验证码登录认证的实战功能.当认证失败后交给了AuthenticationFailureH ...

  3. Spring Security 实战干货:自定义异常处理

    Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...

  4. 安全策略_Spring Security 实战干货:如何实现不同的接口不同的安全策略

    1. 前言 欢迎阅读 Spring Security 实战干货 系列文章 .最近有开发小伙伴提了一个有趣的问题.他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Toke ...

  5. java oauth2搭建_Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

    在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...

  6. oauth2 java 客户端_Spring Security 实战干货:客户端OAuth2授权请求的入口

    正版spring security实战编程与 54.9元 (需用券) 去购买 > 1. 前言 在Spring Security 实战干货:OAuth2第三方授权初体验一文中我先对OAuth2.0 ...

  7. Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 今天我们要进一步的的学习如何自定义配置 Sp ...

  8. Spring Security 实战干货: RBAC权限控制概念的理解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...

  9. Spring Security 实战干货:玩转自定义登录

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 前面的关于 Spring Security  ...

最新文章

  1. 《中国人工智能学会通讯》——4.14 相关研究现状
  2. jaxb和dozer简介
  3. c语言已知斜率 求倾角,倾斜解的问题
  4. 孤荷凌寒自学python第八十一天学习爬取图片1
  5. 解压缩文件命令linux
  6. (转)大型网站架构演化发展历程
  7. 那些年Android黑科技①:只要活着,就有希望
  8. 16.IDA-列出函数中存在的全部call
  9. interface接口实例
  10. OpenXLSX 中文字段读取问题
  11. 切割图形_泉州泡沫景观字切割机厂家
  12. 英雄无敌3高清 Android,安卓TOP10:《英雄无敌3》高清重制版上架
  13. 【Vue2.0】—vue-router(二十七)
  14. 深入理解jvm虚拟机一
  15. 高等数学-空间解析几何与向量代数
  16. ITK VKT 安装-详细
  17. Java菜鸟到大牛学习路线之高级篇
  18. canvas图形操作(缩放、旋转、位移)
  19. hbase实战技术分享案例【网易视频云技术分享】
  20. MyBatis-Plus——MyBatis-Plus概述与集成

热门文章

  1. 基于界面自动化测试框架的发展
  2. 【转载】Weka入门教程
  3. 拼多多算法笔试2020
  4. C语言课后习题(65)
  5. java定时器小程序_【微信小程序】使用setTimeout试试定时器
  6. java反射怎么获取结构体_java反射-使用反射获取类的所有信息
  7. mysql索引条件下推_MySQL索引条件下推的简单测试
  8. 年终盘点:云上争锋,谁领国产数据库之先机?
  9. 云图说|不要小看不起眼的日志,“小日志,大作用”
  10. 基于深度神经网络的噪声标签学习