关于java:使用-SaToken-实现不同的登录模式单地登录多地登录同端互斥登录

1次阅读

共计 3028 个字符,预计需要花费 8 分钟才能阅读完成。

一、需要剖析

如果你常常应用腾讯 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 都有欠缺的解决方案。


参考资料

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