1.用户退出登录时按照uuid清除token

This commit is contained in:
乾乾
2025-05-08 18:25:18 +08:00
parent ede68a4dae
commit 72df36094a
7 changed files with 34 additions and 19 deletions

View File

@@ -72,9 +72,9 @@ public class RedisKey {
public static final String GROUP_ANNOUNCEMENTS_FORMAT = "groupInfo:announcements_%d";
/**
* 用户token存放
* 用户token存放 格式:终端:uid:uuid
*/
public static final String USER_TOKEN_FORMAT = "userToken:%s:uid_%d";
public static final String USER_TOKEN_FORMAT = "userToken:%s:uid_%d:%s";
/**
* 用户refreshToken存放

View File

@@ -65,4 +65,11 @@ public class RoomGroupCache extends AbstractRedisStringCache<Long, RoomGroup> {
public List<Long> evictGroup(String account) {
return null;
}
/**
* 清除所有群组相关缓存
*/
@CacheEvict(cacheNames = "room", allEntries = true)
public void evictAllCaches() {
}
}

View File

@@ -600,6 +600,7 @@ public class RoomAppServiceImpl implements RoomAppService {
groupMemberDao.saveBatch(groupMembers);
// 发送邀请加群消息 ==> 触发每个人的会话
roomGroupCache.evictAllCaches();
applicationEventPublisher.publishEvent(new GroupMemberAddEvent(this, roomGroup, groupMembers, uid));
return roomGroup.getRoomId();
}

View File

@@ -28,12 +28,16 @@ public class OffLineResp {
@Schema(description = "登录ip")
private String ip;
@Schema(description = "本次登录uuid (不需要被清空)")
private String uuid;
public OffLineResp() {
}
public OffLineResp(Long uid, String client, String ip) {
public OffLineResp(Long uid, String client, String ip, String uuid) {
this.ip = ip;
this.uid = uid;
this.client = client;
this.uuid = uuid;
}
}

View File

@@ -136,19 +136,19 @@ public class LoginServiceImpl implements LoginService {
// 1. 拿到token
String token = RequestHolder.get().getToken();
// 2. 解析token里面的数据精准拿到当前用户的refreshToken
try {
// 2. 解析token里面的数据精准拿到当前用户的refreshToken
Map<String, Claim> verifyToken = JwtUtils.verifyToken(token);
Long uid = verifyToken.get(JwtUtils.UID_CLAIM).asLong();
String type = verifyToken.get(JwtUtils.LOGIN_TYPE_CLAIM).asString();
String uuid = verifyToken.get(JwtUtils.UUID_CLAIM).asString();
if(!autoLogin){
// 2.1 用户启用自动登录删除refreshToken
Map<String, Claim> verifyToken = JwtUtils.verifyToken(token);
Long uid = verifyToken.get(JwtUtils.UID_CLAIM).asLong();
String type = verifyToken.get(JwtUtils.LOGIN_TYPE_CLAIM).asString();
String key = RedisKey.getKey(RedisKey.USER_REFRESH_TOKEN_FORMAT, type, uid, verifyToken.get(JwtUtils.UUID_CLAIM).asString());
RedisUtils.del(key);
RedisUtils.del(RedisKey.getKey(RedisKey.USER_REFRESH_TOKEN_FORMAT, type, uid, uuid));
}
// 3. 删除token
RedisUtils.del(RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, JwtUtils.getLoginType(token), RequestHolder.get().getUid()));
RedisUtils.del(RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, type, uid, uuid));
applicationEventPublisher.publishEvent(new UserOfflineEvent(this, User.builder().id(RequestHolder.get().getUid()).lastOptTime(DateUtil.date()).build()));
} catch (Exception e) {
throw TokenExceedException.expired();

View File

@@ -39,18 +39,21 @@ public class TokenServiceImpl implements TokenService {
@Override
public boolean verify(String token) {
Long uid = JwtUtils.getUidOrNull(token);
if (Objects.isNull(uid)) {
return false;
}
return Objects.equals(token, RedisUtils.getStr(RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, JwtUtils.getLoginType(token), uid)));
Map<String, Claim> claim = JwtUtils.verifyToken(token);
if (Objects.isNull(claim)) {
return false;
}
Long uid = claim.get(JwtUtils.UID_CLAIM).asLong();
String loginType = claim.get(JwtUtils.LOGIN_TYPE_CLAIM).asString();
String uuid = claim.get(JwtUtils.UUID_CLAIM).asString();
return Objects.equals(token, RedisUtils.getStr(RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, loginType, uid, uuid)));
}
@Override
public LoginResultVO createToken(Long uid, String loginType) {
// 1. uuid用于后续区分续签是给哪个token续签
String uuid = UUID.randomUUID().toString(true);
String tokenKey = RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, loginType, uid);
String tokenKey = RedisKey.getKey(RedisKey.USER_TOKEN_FORMAT, loginType, uid, uuid);
String refreshTokenKey = RedisKey.getKey(RedisKey.USER_REFRESH_TOKEN_FORMAT, loginType, uid, uuid);
String token = RedisUtils.getStr(tokenKey), refreshToken;
String key = RedisKey.getKey(RedisKey.USER_REFRESH_TOKEN_UID_FORMAT, loginType, uid);
@@ -58,7 +61,7 @@ public class TokenServiceImpl implements TokenService {
// 1.2 token存在 旧设备下线
if (StrUtil.isNotBlank(token)) {
applicationEventPublisher.publishEvent(new TokenExpireEvent(this, new OffLineResp(uid, loginType, RequestHolder.get().getIp())));
applicationEventPublisher.publishEvent(new TokenExpireEvent(this, new OffLineResp(uid, loginType, RequestHolder.get().getIp(), uuid)));
}
// 2. 创建用户token

View File

@@ -183,7 +183,7 @@ public class WXMsgServiceImpl implements WebSocketService {
}
// 让前端的token失效
else {
sendMsg(channel, WsAdapter.buildInvalidateTokenResp(new OffLineResp(JwtUtils.getUidOrNull(wsAuthorize.getToken()), LoginTypeEnum.PC.getType(), null)));
sendMsg(channel, WsAdapter.buildInvalidateTokenResp(new OffLineResp(JwtUtils.getUidOrNull(wsAuthorize.getToken()), LoginTypeEnum.PC.getType(), null, null)));
}
}