需求如下:
-
同一账号在多个手机或终端上同时登录
-
退出登录时各自独立,互不干扰;
-
能实现登录设备的可视化管理,踢人下线;
-
能动态限制手机终端的登录数量
经过调研发现,Sa-token可以满足我们以上需求;
Spring-boot pom 引入
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.42.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson</artifactId>
<version>1.42.0</version>
</dependency>
需要注意的是,如果未配置任何Token的保存媒介时,默认使用 内存方案
这里我们更换为Redis存储
pom 依赖引入
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template</artifactId>
<version>1.42.0</version>
</dependency>
同时需要配置Redis连接参数
spring:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 1
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
# password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
这样配置之后,token的保存方案会自动更换为Redis
为了实现以上功能,Sa-token 需要以下配置
sa-token:
is-share: false
is-concurrent: true
is-share 代表是否共享token,这里我们配置为false,这样各端登录的token就会是独立的
is-concurrent 代表是否允许同一账号多端登录
登录调用
StpUtil.login(Object loginId)
这里的loginId可以使用一个登录的唯一ID, 如用户ID、账号ID;我们使用用户ID,因为其他业务的地方用到了用户ID作为权限校验
StpUtil.login(Object loginId, SaLoginParameter loginParameter )
在loginParameter参数terminalExtraData里面,我们可以放一些 终端设备的信息,比如 手机型号、操作系统、手机名称等
登录设备管理
调用 StpUtil.getTerminalListByLoginId(String loginId), 返回各个终端信息,我们把额外的信息放在extraData里;
退出登录
调用 StpUtil.logout(); 这样只会退出当前端的登录
踢人下线
StpUtil.kickoutByTokenValue(String token)