jeecgboot 同一账号只允许一个人登录

2024-05-28 13:52

本文主要是介绍jeecgboot 同一账号只允许一个人登录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.需求分析

  • jeecgboot 框架要实现同一个账号只允许一个人登录,就跟游戏账号类似,“我登录了就把你踢下去,你登录了就把我踢下去”;
  • jwt 原理是生成 token 后一段时间内登录都有效,jeecgboot 中 jwt 和 redis 联合使用后,在 redis 中 用户过期的 key 是 CommonConstant.PREFIX_USER_TOKEN + token,token 几乎是唯一的
  • 想到JwtUtil.verify(cacheToken, userName, passWord)方法验证的时候想办法给他返回 false,但是发现只要 token 没过期第一个人登录的还是能访问
  • 第二个人登录后,怎样让第一个人访问不了呢?既不能改第一个人浏览器中的 token 信息,又不能把 jwt verify()方法重写了(水平不够,放弃重写);那我就直接把第一个人登录的 key(CommonConstant.PREFIX_USER_TOKEN+token)删了吧,第一人登录的 key 都没有了,这样第一人就下线了。
  • 怎样获取第一人的 key 呢,改写 key 前缀,原来是 CommonConstant.PREFIX_USER_TOKEN + token,改成CommonConstant.PREFIX_USER_TOKEN + admin + ip,去 redis 里面查询前缀是CommonConstant.PREFIX_USER_TOKEN + admin的 samePrefixKeys ,然后把 samePrefixKeys 都删了

2.上代码

在这里插入图片描述

private void onlyOnePlaceLogin(String username,String id) {List<String> keys = redisUtil.keys(CommonConstant.PREFIX_USER_TOKEN+username);keys.forEach(key -> deleteLoginInfo(key,username,id));}
//参考 logout 方法
private void deleteLoginInfo(String key, String username,String id) {//清空用户登录Token缓存redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + username);//清空用户登录Shiro权限缓存redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + id);//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, username));}

3.关联修改

在项目中所有用到 CommonConstant.PREFIX_USER_TOKEN + tokenkey 的地方换成CommonConstant.PREFIX_USER_TOKEN + name + ip

4.最后

结束了,这个方案还没真正上线,只是本地测试没问题,欢迎大家讨论

5.参考

jeecgboot 登录用户唯一实现方式

Springboot集成JWT+Redis实现单点登录和同一账号只允许在一处登录

这篇关于jeecgboot 同一账号只允许一个人登录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010750

相关文章

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

oracle如何连接登陆SYS账号

《oracle如何连接登陆SYS账号》在Navicat12中连接Oracle11g的SYS用户时,如果设置了新密码但连接失败,可能是因为需要以SYSDBA或SYSOPER角色连接,解决方法是确保在连接... 目录oracle连接登陆NmOtMSYS账号工具问题解决SYS用户总结oracle连接登陆SYS账号

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动