若依项目如何实现一个账户只能一个人登录(即,限制账户不允许多终端登录)

这篇具有很好参考价值的文章主要介绍了若依项目如何实现一个账户只能一个人登录(即,限制账户不允许多终端登录)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、不分离版

在application.yml设置maxSession为1即可。修改shiro的配置

二、分离版springboot+vue

1、application.yml新增一个配置soloLogin用于限制多终端同时登录。修改token的配置。

2、Constants.java新增一个常量LOGIN_USERID_KEY公用。

3、调整TokenService.java,存储&刷新缓存用户编号信息

 4、自定义退出处理类LogoutSuccessHandlerImpl.java清除缓存方法添加用户编号。

5、登录方法SysLoginService.java,验证如果用户不允许多终端同时登录,清除缓存信息。


一、不分离版

在application.yml设置maxSession为1即可。

修改shiro的配置

shiro:
  session:
    # 同一个用户最大会话数,比如2的意思是同一个账号允许最多同时两个人登录(默认-1不限制)
    maxSession: 1
    # 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户
    kickoutAfter: false

二、分离版springboot+vue

1、application.yml新增一个配置soloLogin用于限制多终端同时登录。

修改token的配置。

token:
    # 是否允许账户多终端同时登录(true允许 false不允许)
    soloLogin: false

2、Constants.java新增一个常量LOGIN_USERID_KEY公用。

路径:com.zhdj.common.constant.Constants.java。

/**
 * 登录用户编号 redis key
 */
public static final String LOGIN_USERID_KEY = "login_userid:";

3、调整TokenService.java,存储&刷新缓存用户编号信息

路径:com.zhdj.framework.web.service.TokenService.java

// 是否允许账户多终端同时登录(true允许 false不允许)
@Value("${token.soloLogin}")
private boolean soloLogin;

/**
 * 删除用户身份信息
 */
public void delLoginUser(String token, Long userId)
{
	if (StringUtils.isNotEmpty(token))
	{
		String userKey = getTokenKey(token);
		redisCache.deleteObject(userKey);
	}
    //在原有代码上添加下面的代码
	if (!soloLogin && StringUtils.isNotNull(userId))
	{
		String userIdKey = getUserIdKey(userId);
		redisCache.deleteObject(userIdKey);
	}
}

/**
 * 刷新令牌有效期
 * 
 * @param loginUser 登录信息
 */
public void refreshToken(LoginUser loginUser)
{
	loginUser.setLoginTime(System.currentTimeMillis());
	loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
	// 根据uuid将loginUser缓存
	String userKey = getTokenKey(loginUser.getToken());
	redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
	//在原有代码上添加下面的代码
    if (!soloLogin)
	{
		// 缓存用户唯一标识,防止同一帐号,同时登录
		String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
		redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
	}
}

//添加下面的代码
private String getUserIdKey(Long userId)
{
	return Constants.LOGIN_USERID_KEY + userId;
}

 4、自定义退出处理类LogoutSuccessHandlerImpl.java清除缓存方法添加用户编号。

路径:com.zhdj.framework.security.handle.LogoutSuccessHandlerImpl.java

// 删除用户缓存记录
// 在原代码参数中添加用户编号:loginUser.getUser().getUserId()
tokenService.delLoginUser(loginUser.getToken(), loginUser.getUser().getUserId());

5、登录方法SysLoginService.java,验证如果用户不允许多终端同时登录,清除缓存信息。

路径:com.zhdj.framework.web.service.SysLoginService.java

// 是否允许账户多终端同时登录(true允许 false不允许)
    @Value("${token.soloLogin}")
    private boolean soloLogin;

    /**
     * 登录验证
     * 
     * @param username 用户名
     * @param password 密码
     * @param code 验证码
     * @param uuid 唯一标识
     * @return 结果
     */
    public String login(String username, String password, String code, String uuid)
    {
        boolean captchaEnabled = configService.selectCaptchaEnabled();
        // 验证码开关
        if (captchaEnabled)
        {
            validateCaptcha(username, code, uuid);
        }
        // 用户验证
        Authentication authentication = null;
        try
        {
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
        }
        catch (Exception e)
        {
            if (e instanceof BadCredentialsException)
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                throw new ServiceException(e.getMessage());
            }
        }
        finally
        {
            AuthenticationContextHolder.clearContext();
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUserId());
        // 添加到这里
        // 判断是否允许账户多终端同时登录
        if (!soloLogin)
        {
            // 如果用户不允许多终端同时登录,清除缓存信息
            String userIdKey = Constants.LOGIN_USERID_KEY + loginUser.getUser().getUserId();
            String userKey = redisCache.getCacheObject(userIdKey);
            if (StringUtils.isNotEmpty(userKey))
            {
                redisCache.deleteObject(userIdKey);
                redisCache.deleteObject(userKey);
            }
        }
        // 生成token
        return tokenService.createToken(loginUser);
    }

 参考资料:若依框架官方文档文章来源地址https://www.toymoban.com/news/detail-481232.html

到了这里,关于若依项目如何实现一个账户只能一个人登录(即,限制账户不允许多终端登录)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓studio 个人课设项目:“这个app“——实现注册登录,显示用户信息功能,并跳转对应网页

    目录 目录 功能说明  登录页面 注册页面 登录后界面 点击头像出现侧滑界面,并显示用户信息 点击编辑按钮进入信息编辑页面  保存后返回  用户名已更改 跳转网页 相关代码 布局 登录界面  注册界面  信息显示界面  主界面 实现侧滑布局  信息编辑界面 网页显示界面 

    2023年04月26日
    浏览(33)
  • windows10/11系统实现本地账户密码登录微软账户 微软账户取消pin登录

    Windows 10支持两种账户登录模式,一种是使用了多年的通过本地用户账户来登录系统,另一种则是使用Microsoft账户来登录系统。使用Microsoft账户登录Windows系统是从Windows 8开始支持的登录模式,这种登录模式会自动连接到微软,然后对账户信息与系统设置进行自动同步。 简单来

    2024年02月13日
    浏览(39)
  • 在 Mac 上如何更改用户全名/账户名/个人文件夹名/电脑名?

    很多人在使用 Mac 的时候都会有更改用户全名/账户名/电脑名称的需求,但又不知道如何更改。本文就教教大家如何更改这些名称。 macOS 中会出现四种表示用户账户的名称。分别是: 用户全名 账户名称 个人文件夹的名称 本地网络(例如,隔空投送AirDrop)中显示的电脑名称

    2024年02月16日
    浏览(38)
  • C语言:编写代码实现,模拟用户登录情景,并且只能登录三次

    编写代码实现, 模拟用户登录情景 ,并且 只能登录三次 。                   只 允许输入三次密码 , 如果 密码正确 则 提示登录成功 , 如果 三次均输入错误 ,则 退出程序 。                       =========================================================================          

    2024年02月08日
    浏览(28)
  • 如何配置azure AD 通过登录azure的账户密码登录Azure VM

    Azure vm 添加 Azure AD 通过邮箱的账户密码登录 首先创建一个虚拟机,并且勾选Azure AD的复选框。 将创建虚机生成的资源最好配置到同一资源组 例如: 在vm生成的全部资源所在的资源组下打开访问控制

    2024年02月09日
    浏览(39)
  • 若依框架登录后跳转其他页面&获取不同的菜单&登录进入后跳转至动态路由的第一个路由

    最近碰到的需求是登录进入后,先跳转至一个自己定义的页面,在这个页面选择一个系统后,进入若依的系统,根据选择的系统获取相应的菜单,进入页面后默认跳转至后端返回的动态路由的第一个路由 1.首先在登录页面login.vue做如下改动 写成你要跳转过去的页面:(这个路由如果是

    2024年02月01日
    浏览(40)
  • 在有springSecurity或者若依项目中获取当前系统登录的用户信息

    方法一(springSecurity自带的) @AuthenticationPrincipal 是 Spring Security 框架中的一个注解,用于获取当前已认证用户的 principal(即用户身份信息)。 方法二(若依项目自带的) (1)方法1.1 (2)方法1.12 SecurityContextHolder.getContext().getAuthentication().getName()

    2024年04月12日
    浏览(31)
  • Python构建自动在线刷视频—一个只能做不能说的项目

    学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效率很低,而让Python这个不知疲倦、不怕麻烦与辛苦、不会抱怨的助手去搞定主人想做的一切。自

    2024年02月06日
    浏览(45)
  • 若依Springboot实现小程序登录

    ✅作者:TuNan ✨个人主页:图南的个人主页 😉欢迎关注🔎点赞😍收藏⭐留言💌 一、微信小程序官方登录流程图 主要的流程就是调用 wx.getUserProfile 向微信服务器发送请求获取code和其他的一些信息,然后再通过wx.login向我们的后台发送请求获取 session_key 和 openid 等其他信息

    2024年02月03日
    浏览(25)
  • QT实现窗口的账户以及密码判断登录和退出

    一、作业要求: 1、找出槽函数调用两次的原因         在Qt中使用信号调用槽函数时,当槽函数的函数名定义格式为 “on_对象名_信号”时,则不需要在使用connect来连接信号与槽函数,系统会自动连接信号与槽函数。如果再次使用了connect来连接,则会调用两次槽函数。

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包