Spring Security OAuth2 实现多人登录互踢下线

article/2025/9/17 8:58:52

背景说明

一个账号只能一处登录,类似的业务需求在现有后管类系统是非常常见的。但在原有的 spring security oauth2 令牌方法流程(所谓的登录)无法满足类似的需求。

我们先来看 TokenEndpoint 的方法流程

客户端 带参访问 /oauth/token 接口,最后去调用 TokenGranter

TokenGranter 根据不同的授权类型,获取用户认证信息 并去调用TokenServices 生成令牌

重新 TokenService

  • 重写发放逻辑createAccessToken,当用户管理的令牌存在时则删除重新创建,这样会导致之前登陆获取的token 失效,顺理成章的被挤掉。

	@Transactionalpublic OAuth2AccessToken createAccessToken() {OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication);OAuth2RefreshToken refreshToken = null;// 重写此处,当用户关联的token 存在时,删除原有令牌if (existingAccessToken != null) {tokenStore.removeAccessToken(existingAccessToken);}else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken;if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {refreshToken = createRefreshToken(authentication);}}OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);tokenStore.storeAccessToken(accessToken, authentication);// In case it was modifiedrefreshToken = accessToken.getRefreshToken();if (refreshToken != null) {tokenStore.storeRefreshToken(refreshToken, authentication);}return accessToken;
}

重写 Token key 生成逻辑

  • 如上代码,我们实现用户单一终端的唯一性登录,什么是单一终端 我们可以类比 QQ 登录 移动端和 PC 端可以同时登录,但 移动端 和移动端不能同时在线。

  • 如何能够实现 在不同客户端也能够唯一性登录呢?

先来看上文源码 OAuth2AccessToken existingAccessToken=tokenStore.getAccessToken(authentication); 是如何根据用户信息判断 token 存在的呢?

public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {String key = authenticationKeyGenerator.extractKey(authentication);// redis 查询逻辑,根据 keyreturn accessToken;
}
  • AuthenticationKeyGenerator key值生成器 默认情况下根据 username/clientId/scope 参数组合生成唯一token

登录后复制 

public String extractKey(OAuth2Authentication authentication) {Map<String, String> values = new LinkedHashMap<String, String>();OAuth2Request authorizationRequest = authentication.getOAuth2Request();if (!authentication.isClientOnly()) {values.put(USERNAME, authentication.getName());}values.put(CLIENT_ID, authorizationRequest.getClientId());if (authorizationRequest.getScope() != null) {values.put(SCOPE, OAuth2Utils.formatParameterList(new TreeSet<String>(authorizationRequest.getScope())));}return generateKey(values);
}
  • 若想实现,多终端的唯一性登录,只需要使得同一个用户在多个终端生成的 token 一致,加上上文提到的 createToken 修改逻辑,既去掉extractKey 的 clientId 条件,不区分终端即可

public String extractKey(OAuth2Authentication authentication) {Map<String, String> values = new LinkedHashMap<String, String>();OAuth2Request authorizationRequest = authentication.getOAuth2Request();if (!authentication.isClientOnly()) {values.put(USERNAME, authentication.getName());}if (authorizationRequest.getScope() != null) {values.put(SCOPE, OAuth2Utils.formatParameterList(new TreeSet<String>(authorizationRequest.getScope())));}return generateKey(values);
}
  • 最后在 authserver 中注入新的 TokenService 即可


http://chatgpt.dhexx.cn/article/eydeMccQ.shtml

相关文章

csgo服务器取消自动踢人,CSGO踢出玩家Kick相关控制台指令

本文将介绍CSGO一些关于踢人/KICK控制台指令&#xff0c;如果你自建服务器或本地建房的话&#xff0c;可能会用得上。 mp_autokick 如果你不想让好友因为队友伤害或挂机/AFK被服务器自动踢出&#xff0c;那么需要输入&#xff1a; mp_autokick 0 这样&#xff0c;服务器中的玩家…

单一用户登录,即当前用户登录后要踢出前一个登录,即做出踢人效果,如何实现?

单一用户登录&#xff0c;即当前用户登录后要踢出前一个登录&#xff0c;即做出踢人效果&#xff0c;如何实现&#xff1f; 一般情况下&#xff0c;用户登录&#xff0c;有两种方式&#xff1a;cookie方式&#xff0c;session方式。一般情况下&#xff0c;session方式是使用最…

【开发经验】客户端互踢实现思路

文章目录 场景如下实现思路 踢用户实现思路、用户单个客户端登录。冻结用户实现 场景如下 每个用户只能登录一个客户端&#xff0c;如微信、支付宝等app&#xff0c;只能在一个手机登录&#xff0c;如果再别的手机登录&#xff0c;则会踢掉之前的那个。冻结账户&#xff0c;账…

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

前言 最近&#xff0c;说有可能要上只允许一个地方登录&#xff0c;还要配合信息推送&#xff0c;今天有空&#xff0c;就起个头&#xff0c;把登录超时、登录踢人下线一起做了。信息推送的&#xff0c;后面再说&#xff0c;留好口子就行。 一、背景 这里是spring security&am…

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

查看文章 欢迎您&#xff01; 返回首页 最后修改于&#xff1a;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&#xff0c;大家好&#xff0c;我叫善念。有点懒 好久没有给大家更新教程了。今天给大家带来的项目比较有趣&#xff0c;而且非常简单&#xff0c;简称 有手即可&#xff01;…

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

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

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

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

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

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

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

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

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

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

SAP SM04踢人操作(摘录)

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

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

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

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

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

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

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

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

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

百度大数据迁徙

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

什么是计算迁移

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

迁徙数据平台简单介绍

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