使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录

这篇具有很好参考价值的文章主要介绍了使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求分析

如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号。

同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线。

动态演示图:

Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。
Gitee 开源地址:https://gitee.com/dromara/sa-token

本文将介绍在 Sa-Token 中,如何实现以下登录策略:

  • 单地登录:指一个账号同一时间只能在一个地方登录,新登录会挤掉旧登录,也可以叫:单端登录。
  • 多地登录:指一个账号同一时间可以在不同地方登录,新登录会和旧登录共存,也可以叫:多端登录。
  • 同端互斥登录:在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线,参考腾讯QQ的登录模式:手机和电脑可以同时在线,但不能两个手机同时在线。

与之对应的,注销策略也将分为以下几种:

  • 单端注销:只在调用退出的一端注销。
  • 全端注销:一端注销,全端下线。
  • 同端注销:例如将所有手机端注销下线,PC端不受影响。

二、多地登录

此模式较为简单,Sa-Token 默认模式即为多地登录模式。

1、首先引入 Sa-Token 依赖:
<!-- Sa-Token 权限认证 -->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-spring-boot-starter</artifactId>
	<version>1.34.0</version>
</dependency>

注:如果你使用的是 SpringBoot 3.x,只需要将 sa-token-spring-boot-starter 修改为 sa-token-spring-boot3-starter 即可。

2、在用户登录时将账号id写入会话中
@RestController
@RequestMapping("/user/")
public class UserController {
	@RequestMapping("doLogin")
	public SaResult doLogin(String username, String password) {
		// 此处仅作示例模拟,真实项目需要从数据库中查询数据进行比对 
		if("zhang".equals(username) && "123456".equals(password)) {
			StpUtil.login(10001);
			return SaResult.ok("登录成功");
		}
		return SaResult.ok("登录失败");
	}
}

启动类:

@SpringBootApplication
public class SaTokenDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SaTokenDemoApplication.class, args); 
		System.out.println("\n启动成功:Sa-Roken 配置如下:" + SaManager.getConfig());
	}
}

如上代码,在多人登录同一账号时将不会对旧会话做任何处理,同一账号可以在多个地点任意登录,互不影响。

3、如果要全端注销,可以调用 logout 方法:
// 会话注销
@RequestMapping("logout")
public SaResult logout() {
	StpUtil.logout();
	return SaResult.ok("退出登录成功");
}

调用如上方法注销后,当前账号所有端将一起下线。

4、单端注销

如果要只注销一端,可将配置文件中 is-share 的值配置为 false

sa-token:
	is-share: false

此配置项的含义为:在多人登录同一账号时,是否共用一个 Token。

  • 为 true 时:所有登录共用一个 Token。
  • 为 false 时:每次登录新建一个 Token。

此值为 false 后,每次登录都将返回不同的 Token,与之对应的,调用 StpUtil.logout() 也只会注销掉当前的 Token,其他端不受影响。

三、单地登录

单地登录的重点是需要改一下 yml 配置文件:

sa-token: 
	is-concurrent: false

is-concurrent 的含义为是否允许同一账号并发登录:

  • 为 true 时:允许一起登录。
  • 为 false 时:新登录挤掉旧登录。

其它代码与 [多地登录] 无异,当我们在两个浏览器分别登录同一账号时,旧会话再次访问系统将会得到如下提示:

{
	"code": 401,
	"msg": "Token 已被顶下线",
	"data": null
}

在 单地登录 模式中,不存在注销策略的问题,因为同一时间内,一个账号最多在一个设备在线,只要调用注销,就必然是全端下线。

四、同端互斥登录

好了,终于轮到主角出场,同端互斥登录可以让我们像腾讯QQ一样,在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线。

那么在 Sa-Token 中如何做到同端互斥登录呢?

首先如 单地登录一样,在配置文件中,将 sa-token.is-concurrent 配置为false,然后调用登录等相关接口时声明设备标识即可:

1、指定设备标识登录
StpUtil.login(10001, "PC");    

调用此方法登录后,同设备的会被顶下线(不同设备不受影响),再次访问系统时会抛出 NotLoginException 异常,场景值=-4

场景值 对应常量 含义说明
-1 NotLoginException.NOT_TOKEN 未能从请求中读取到 Token
-2 NotLoginException.INVALID_TOKEN 已读取到 Token,但是 Token无效
-3 NotLoginException.TOKEN_TIMEOUT 已读取到 Token,但是 Token已经过期
-4 NotLoginException.BE_REPLACED 已读取到 Token,但是 Token 已被顶下线
-5 NotLoginException.KICK_OUT 已读取到 Token,但是 Token 已被踢下线

如果第二个参数填写null或不填,代表将这个账号id所有在线端踢下线,被踢出者再次访问系统时会抛出 NotLoginException 异常,场景值=-5

2、查询当前登录的设备标识
StpUtil.getLoginDevice(); 

如果在登录时未指定设备类型值,调用此方法将返回默认值:default-device

3、指定设备端类型下线

业务场景举例:在手机端控制PC端下线(手机端本身不受影响)

StpUtil.logout(10001, "PC");		
4、全端下线

在调用 logout 方法时,不填写具体的设备端类型,将默认控制所有端一起下线。

StpUtil.logout(10001);		

以上就是 Sa-Token 框架在处理登录问题时的各种方案,可以看出不管是简单的多地登录还是复杂的同端互斥登录,在 Sa-Token 都有完善的解决方案。文章来源地址https://www.toymoban.com/news/detail-539799.html


参考资料

  • Sa-Token 文档:https://sa-token.cc
  • Gitee 仓库地址:https://gitee.com/dromara/sa-token
  • GitHub 仓库地址:https://github.com/dromara/sa-token

到了这里,关于使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot 使用 Sa-Token 完成权限认证

    所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限: 有,就让你通过。 没有?那么禁止访问! 深入到底层数据中,就是每个账号都会拥有一个权限码集合,框架来校验这个集合中是否包含指定的权限码。 例如:当前账号拥有权限码集合 [\\\"user-add\\\", \\\"user-delete\\\", \\\"us

    2023年04月25日
    浏览(33)
  • 使用 Sa-Token 完成踢人下线功能

    在企业级项目中,踢人下线是一个很常见的需求,如果要设计比较完善的话,至少需要以下功能点: 可以根据用户 userId 踢出指定会话,对方再次访问系统会被提示:您已被踢下线,请重新登录。 可以查询出一个账号共在几个设备端登录,并返回其对应的 Token 凭证,以便后

    2024年02月03日
    浏览(28)
  • SpringBoot 使用 Sa-Token 完成路由拦截鉴权

    在前文,我们详细的讲述了在 Sa-Token 如何使用注解进行权限认证,注解鉴权虽然方便,却并不适合所有鉴权场景。 假设有如下需求:项目中所有接口均需要登录认证校验,只有 “登录接口” 本身对外开放。 如果我们对项目所有接口都加上 @SaCheckLogin 注解,会显得非常冗余

    2024年02月05日
    浏览(30)
  • spring boot +Sa-Token优雅的实现项目鉴权!

    最近在做登录、授权的功能,一开始考虑到的是spring boot + spring security,但spring security太重,而我们是轻量级的项目,所以,spring security不适合我们。 而后考虑spring boot + shiro,但shiro自带的aop会影响spring boot的aop,所以,shiro也不适合我们。 后来浏览github时,发现Sa-Token这个框

    2024年02月06日
    浏览(38)
  • SpringBoot 使用 Sa-Token 完成注解鉴权功能

    注解鉴权 —— 优雅的将鉴权与业务代码分离。本篇我们将介绍在 Sa-Token 中如何通过注解完成权限校验。 Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。 Gitee 开源地址:https://gitee.com/dromar

    2024年02月04日
    浏览(28)
  • sa-token多端登陆实现,PC,APP登陆分别设置token过期时间

    Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。 登录认证 —— 单端登录、多端

    2024年02月08日
    浏览(32)
  • Sa-Token浅谈

    主要介绍Sa-Token的鉴权使用以及实现原理。 官网介绍的非常详细,主要突出这是一个轻量级鉴权框架的特点,详情可自行访问:https://sa-token.dev33.cn/doc.html#/ 旨在简单使用,大部分功能均可以在一行代码内实现,这里举几个官网示例: 首先添加依赖: yaml配置文件: 功能图如下

    2024年02月09日
    浏览(41)
  • Sa-Token组件介绍

    个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 前文讲了Sa-Token介绍与SpringBoot环境下使用,但是 satoken 最重要的登录鉴权直接略过了,那这篇文章就开讲,😂当然不是啦。看标题就知道这次要讲的是 satoken 组件,为什么这么安排

    2024年01月20日
    浏览(27)
  • Sa-Token源码简单阅读

    一.权限登录模块包括几个基本子模块: 1.登录。 实现方式大致为:先检验用户名密码是否正确,如正确则在 缓存 中存入用户信息(一般必须要有用户标识和访问token,或再加一些附加信息如用户的角色权限),再返回访问token给客户端。 2.过滤器,主要通过客户端访问时带

    2023年04月26日
    浏览(31)
  • mall :sa-token项目源码解析

    目录 一、mall开源项目 1.1 来源 1.2 项目转移 1.3 项目克隆 二、Sa-Toekn框架 2.1 Sa-Token 简介 2.2 分布式后端项目的使用流程 2.3 分布式后端项目的使用场景 三、源码解析 3.1 集成与配置 3.1.1 导入依赖 3.1.2 添加配置 3.1.3 异常处理 3.1.4 存储用户信息 3.2 登录认证 3.2.1 配置黑白名单

    2024年02月12日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包