登录超时提示+踢人下线实现(spring security)

article/2025/9/17 23:46:28

前言

       最近,说有可能要上只允许一个地方登录,还要配合信息推送,今天有空,就起个头,把登录超时、登录踢人下线一起做了。信息推送的,后面再说,留好口子就行。


一、背景

这里是spring security,其实这块已经很成熟了,加几个配置就行。

二、使用步骤

1.security配置增加


/*** 安全认证配置** @author zhengwen*/
@Configuration
@EnableWebSecurity
@Order(1)
public class LinkappSecurityConfiguration extends WebSecurityConfigurerAdapter {@Resourceprivate SessionInformationExpiredStrategy sessionInformationExpiredStrategy;@Resourceprivate InvalidSessionStrategy invalidSessionStrategy;@Overrideprotected void configure(HttpSecurity http) throws Exception {//		解决 spring security 对于开放接口返回乱码的解决CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");filter.setForceEncoding(true);http.addFilterBefore(filter, CsrfFilter.class);http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);http// 禁止匿名用户// .anonymous().disable()// 禁止csrfz.csrf().disable()// 认证失败处理.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)).and()// 白名单.authorizeRequests().antMatchers("/swagger-ui.html", "/webjars/**", "/swagger-resources/**", "/v2/api-docs/**",           "/enterpriseEditionBi/**","/oss/download/**","/download/**","/config/getEduUrl").permitAll()// 接口调试阶段 目前不校验接口 modify by tongjie.anyRequest().authenticated().and()// 表单登录配置.formLogin()// 登录成功处理.successHandler(linkappRestAuthenticationSuccessHandler)// 登录失败处理.failureHandler(linkappRestAuthenticationFailureHandler).and()// 登出成功处理.logout().logoutSuccessHandler(linkappRestLogoutSuccessHandler);//一个账号只允许一个地方登录,http.sessionManagement()//session失效,调用此方法.invalidSessionStrategy(invalidSessionStrategy).maximumSessions(1)// 当用户达到最大session数后,则调用此处的实现.expiredSessionStrategy(sessionInformationExpiredStrategy);}@Bean@ConditionalOnMissingBean(InvalidSessionStrategy.class)public InvalidSessionStrategy invalidSessionStrategy() {return new MyInvalidSessionStrategy();}@Bean@ConditionalOnMissingBean(SessionInformationExpiredStrategy.class)public SessionInformationExpiredStrategy informationExpiredStrategy() {return new MySessionInformationExpiredStrategy();}
}

http.sessionManagement()开始就是本次分享内容。注意下面的2个bean,@Bean注解的。

2.MyInvalidSessionStrategy


/*** @author zhengwen*/
public class MyInvalidSessionStrategy implements InvalidSessionStrategy {@Overridepublic void onInvalidSessionDetected(HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException {/* 接口请求没有页面,给统一的友好提示,可以直接利用封装的的业务异常response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);response.setContentType("application/json;charset=utf-8");response.getWriter().write("当前登录已失效!请重新登录");*/throw new BusinessException("当前登录已失效!请重新登录");}
}

BusinessException是封装的业务异常类。

3.MySessionInformationExpiredStrategy


/*** @author zhengwen*/
@Slf4j
@Component
public class MySessionInformationExpiredStrategy implements SessionInformationExpiredStrategy {@Autowiredprivate LinkappRestAuthenticationFailureHandler myAuthenticationFailureHandler;@Overridepublic void onExpiredSessionDetected(SessionInformationExpiredEvent event) {// 1. 获取用户名UserDetails userDetails =(UserDetails) event.getSessionInformation().getPrincipal();AuthenticationException exception =new AuthenticationServiceException(String.format("[%s]用户在其他地方登录,您已被下线", userDetails.getUsername()));//TODO 这里可以增加根据用户名找到手机号信息,进行推送信息,或者在myAuthenticationFailureHandler里去处理try {// 当用户在另外终端登录后,交给失败处理器回到认证页面event.getRequest().setAttribute("toAuthentication", true);myAuthenticationFailureHandler.onAuthenticationFailure(event.getRequest(), event.getResponse(), exception);} catch (Exception e) {log.error("--登录失效session清除异常,原因:{}", e.getMessage());throw new BusinessException("超时登录session清除异常");}}
}

4.MyAuthenticationFailureHandler

/*** 认证失败处理者** @author zhengwen*/
@Component
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,AuthenticationException exception) {//TODO 自己的异常处理逻辑RestMessage message = RestBuilders.failureBuilder().code("login.failure").message(exception.getMessage()).build();Responses.standard(response).respond(message);}}

三、看效果

1.先在postman登录成功。

在这里插入图片描述

2.再请求一个业务接口

在这里插入图片描述

3.然后在另外一个地方登录同一个账号,这里用FE的简易postman工具模拟

在这里插入图片描述

4.最后再重新请求下那个业务接口

在这里插入图片描述
多的废话以不想说了额,这一组图看的真真的。


总结

  • spring security用户登录session登录管理真强大,虽然说很重,但是用起来确实方便。
  • 现在spring security不像以前了,它也与时俱进,配置早springBoot里做的很友好了
  • 你们猜.maximumSessions(2)会先踢哪个?
  • 如果要加信息推送知道在那里加了吧?认真看TODO
    好了,就到这吧,UPing!!

http://chatgpt.dhexx.cn/article/2Jt3pN9l.shtml

相关文章

【LEDE】树莓派上玩LEDE终极指南-86-OpenWrt增加踢人功能

查看文章 欢迎您! 返回首页 最后修改于:2018-03-27 20:03:12 修改 导出 原理 ubus call hostapd.wlan1 del_client "{addr:AC:0D:1B:D0:60:29, reason:5, deauth:false, ban_time:0}" 步骤 修改/usr/lib/lua/luci/view/admin_status/index.ht…

Python搭建QQ机器人,监控QQ发言与进群退群,自动@新成员并屏蔽脏话踢人

目录 前言 原理 准备 go-cqhttp插件安装 nonebot框架的安装 插件的拓展 效果 警告 前言 emmmm,大家好,我叫善念。有点懒 好久没有给大家更新教程了。今天给大家带来的项目比较有趣,而且非常简单,简称 有手即可!…

用户唯一登录,最新登录挤掉以前的登录,实现踢人.

最近在做一个功能,要求是这样的:相同的账号,例如admin账号,在A电脑登录成功,然后admin账号在B电脑登录,系统发现admin账号出现了重复登录,A电脑上登录的admin账号就会被退出登录。 流程图&…

企业微信群管理员可以踢人吗?企业微信群怎么自动踢人?

我们使用企业微信运营客户时,总会有人在企业微信群里面发广告、链接,非常影响其他客户的体验,有没有什么方法将这些人踢出群聊呢? 企业微信群怎么自动踢人? 在企业微信推出群防骚扰功能之前,群管理员最无奈…

spring boot + shiro 实现登陆 踢出用户功能 (挤人) 以及UnknownSessionException异常问题 记住我功能

简介:踢出用户功能:就是限制一个账号登陆人数。 本文限定一个账号一个用户登陆,并且是挤掉前一个用户 目录 首先 pom 然后Shiro配置Bean ShiroConfigBean 然后配置 ShiroRealm(百度翻译: Realm 领域) 然…

java怎么实现踢掉在线用户_Java多人在线聊天室(3)— 踢人下线功能

作为一个聊天室,肯定会有很多人在里面聊天,那么要是有人里面捣乱怎么办?直接踢人不解释。 我们在创建数据库的时候就有这样的考虑,所以我们的账户有两种,一种是管理员,一种是普通用户。 打开的数据库&#…

Shiro实现session限制登录数量踢人下线

Shiro实现session限制登录数量踢人下线 前言实现■ 架构准备ShiroConfig ■ redis内的存储分布■ 代码修改修改 JedisSessionDAO修改 SystemAuthorizingRealm新增 ApiLogoutFilter再次修改 JedisSessionDAO 最后 前言 近年无状态登录兴起,但sessionId方式仍是主流方…

SAP SM04踢人操作(摘录)

管理员在SAP系统中,使用事物码SM04对当前登录在线用户(User)进行管理,可查看服务器全部客户端(Client)的用户的在线状态,并可以结束指定用户的会话状态,也就是强制踢出用户。 双击查…

出生率新低!1978-2020中国人口出生率、死亡率及自然增长率变迁

根据国家统计局近日发布的《中国统计年鉴2021》,2020中国人口出生率为8.52‰,再创历史新低。同时,2020中国人口自然增长率仅为1.45‰,勉强维持正增长,同样是历史新低。 下面的视频记录了1978-2020中国人口出生率、死亡…

百度迁徙大数据整理[2020+2019同期]

统筹推进疫情防控和经济社会发展工作是常态化疫情防控阶段促进中国经济恢复的必然选择。基于百度地图迁徙大数据,采用双重差分模型探究不同阶段的疫情防控措施对中国人口流动的影响。结果表明,早期的疫情超常规防控措施有效控制了人口流动,导…

【SQLPlanet】基于迁徙率等指标浅析拍拍贷逾期数据(未完待续)

1、背景介绍 拍拍贷是一家金融科技公司,2007年成立于上海,并在2017年11月10日成功于美国纽交所上市。根据官方消息,截至2018年9月30日,拍拍贷累计成交额已突破1300亿,15-29天及30-59天的逾期率分别为0.83%和1.21%&…

百度迁徙 迁入人口和迁徙规模爬虫

最近做COVID-19相关的课程项目,需要用到省级间人口迁移的数据。笔者参考改进了https://blog.csdn.net/qq_44315987/article/details/104118498 的城市间流动的代码,从百度迁徙爬取了数据,并将数据保存在同一张表内。 迁入人口 # coding:utf…

百度大数据迁徙

我记得,百度地图应该是2018年开始做每年春运出行大数据迁移,2019年加入了国庆的迁移大数据分析。这是纯免费的大数据分析数据,相当有意思,但是不作保存,每年做个记录,应该是件有价值的事。 从整体来看&…

什么是计算迁移

0 1 计算迁移背景 边缘计算将网络边缘上的计算、存储等资源进行有机融合,构建成统一的用户服务平台,按就近服务原则对网络边缘节点任务请求及时响应并有效处理。由于边缘节点能力、资源、带宽、能源等受限,计算迁移便异常重要。计算迁移是边缘…

迁徙数据平台简单介绍

引言 人口迁徙数据是研究人口流动、人口迁徙以及城市发展的重要数据源。近年来,受新冠肺炎疫情影响,以及互联网的快速发展,相关数据受到广泛关注与应用,以人口迁徙数据为基础的科学研究也层出不穷。在这里,就对几种常…

人口迁徙大数据(2019-2020年)

人口迁徙大数据具有极高的研究价值,特别是与城市群、疫情等重要话题结合起来,发表了很多核心期刊: 迁徙数据(1) 高德地图人口迁徙数据:2020年前6个月的400多万条数据,数据为日数据,…

【迁移学习】分布差异的度量以及迁移学习的统一表征方法

在文本分类中,由于文本数据有其领域特殊性,因此,在一个领域上训练的分类器,不能直接拿来作用到另一个领域上,这就需要用到迁移学习。 迁移学习是机器学习中重要的研究领域,ICML、NIPS、AAAI、ICIR等国际人工…

手把手实操系列|贷后迁徙率模型开发(上篇)

序言: 很多关注番茄风控的老铁们都知道,番茄风控的开篇就是从系统性的贷后评分卡开始的,关于贷后相关的内容,番茄不敢说是元老级别的公众号,但再怎么说也是先行者,之前的文章比如这些经典内容,您…

手把手系列|贷后评分(C)卡模型开发实操(全)

序言: 随着风控精细化的管理,番茄风控也就将现有的内容进一步迭代,更新贷后迁徙率模型的内容,同时也综合了星球社区中同学的一些新需求,给大家梳理了贷后迁徙率模型的文章。 希望对所有的风控人员在贷后相关的模型开发…