[fix] 通道数据添加appKey、appSecret、originalIp验证

This commit is contained in:
wujiawei
2024-10-19 22:31:41 +08:00
parent 55ce3ff359
commit b7d571ccc1
25 changed files with 538 additions and 77 deletions

View File

@ -182,7 +182,7 @@ public class LazyNettyClusterNodeApplicationImpl implements LazyNettyClusterNode
NettyClientSocket nettyClientSocket = new
NettyClientSocket(inetHost, inetPort, clusterNodeClientId,
clusterNodeId,
clusterNodeId,null,null,
clientChangeEvent, handleChannelTypeAdvancedList);
// 过滤已经存在的
boolean anyMatch = cacheClusterNettyClientSocketMap

View File

@ -41,12 +41,14 @@ public class HeartbeatServerConfiguration {
LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication,
LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication,
LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication,
LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication) {
LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication,
LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication) {
return new ServerHandleClientConnectSuccessTypeAdvanced(lazyClientStatsChangeApplication,
lazyNettyClientBlacklistApplication,
lazyInternalNetworkServerPermeateClientMappingApplication,
lazyInternalNetworkClientPermeateServerMappingApplication,
lazyInternalNetworkClientPermeateClientMappingApplication);
lazyInternalNetworkClientPermeateClientMappingApplication,
lazyNettyClientTokenBucketApplication);
}
/**

View File

@ -12,10 +12,13 @@ import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeK
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.*;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.permeate.client.mapping.LazyInternalNetworkClientPermeateClientMappingQueryListCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.permeate.server.mapping.LazyInternalNetworkClientPermeateServerMappingQueryListCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyInternalNetworkClientPermeateClientMappingDTO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyInternalNetworkClientPermeateServerMappingDTO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.blacklist.LazyNettyClientBlacklist;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket;
import org.springframework.stereotype.Component;
import org.wu.framework.web.response.Result;
import java.nio.charset.StandardCharsets;
import java.util.List;
@ -35,12 +38,14 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle
private final LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication;
private final LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication;
public ServerHandleClientConnectSuccessTypeAdvanced(LazyClientStatsChangeApplication lazyClientStatsChangeApplication, LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication, LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication, LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication, LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication) {
private final LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication;
public ServerHandleClientConnectSuccessTypeAdvanced(LazyClientStatsChangeApplication lazyClientStatsChangeApplication, LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication, LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication, LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication, LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication, LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication) {
this.lazyClientStatsChangeApplication = lazyClientStatsChangeApplication;
this.lazyNettyClientBlacklistApplication = lazyNettyClientBlacklistApplication;
this.lazyInternalNetworkServerPermeateClientMappingApplication = lazyInternalNetworkServerPermeateClientMappingApplication;
this.lazyInternalNetworkClientPermeateServerMappingApplication = lazyInternalNetworkClientPermeateServerMappingApplication;
this.lazyInternalNetworkClientPermeateClientMappingApplication = lazyInternalNetworkClientPermeateClientMappingApplication;
this.lazyNettyClientTokenBucketApplication = lazyNettyClientTokenBucketApplication;
}
@ -54,10 +59,17 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle
public void doHandler(Channel newChannel, NettyProxyMsg msg) {
String clientId = new String(msg.getClientId());
String clientId = msg.getClientIdString();
String appKey = msg.getAppKeyString();
String appSecret = msg.getAppSecretString();
String originalIp = msg.getOriginalIpString();
ChannelContext.push(newChannel, clientId);
ChannelAttributeKeyUtils.buildClientId(newChannel, clientId);
ChannelAttributeKeyUtils.buildAppKey(newChannel, appKey);
ChannelAttributeKeyUtils.buildAppSecret(newChannel, appSecret);
ChannelAttributeKeyUtils.buildOriginalIp(newChannel, originalIp);
// 客户端:{}IP:{}连接成功
log.info("Client: {}, IP: {} Connection successful", new String(msg.getClientId()), newChannel.remoteAddress().toString());
// 验证客户端是否时黑名单
@ -66,31 +78,46 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle
lazyNettyClientBlacklist.setIsDeleted(false);
lazyNettyClientBlacklistApplication.exists(lazyNettyClientBlacklist).accept(exists -> {
if (!exists) {
// 服务状态在线
lazyClientStatsChangeApplication.clientOnLine(clientId);
// 当前在线客户端数量:{}
log.info("Current number of online clients: {}", ChannelContext.getClientIds().size());
// 所有的客户端ID
List<String> clientIdList = ChannelContext.getClientIds();
// 认证验证
Result<Boolean> existsTokenResult = lazyNettyClientTokenBucketApplication.certificationToken(clientId, appKey, appSecret);
Boolean existsToken= existsTokenResult.getData();
if(existsToken){
// 服务状态在线
LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand();
lazyNettyClientLoginCommand.setClientId(clientId);
lazyNettyClientLoginCommand.setAppKey(appKey);
lazyNettyClientLoginCommand.setAppSecret(appSecret);
lazyNettyClientLoginCommand.setOriginalIp(originalIp);
lazyClientStatsChangeApplication.clientOnLine(lazyNettyClientLoginCommand);
// 当前在线客户端数量:{}
log.info("Current number of online clients: {}", ChannelContext.getClientIds().size());
// 所有的客户端ID
List<String> clientIdList = ChannelContext.getClientIds();
// TODO 多副本本地channel 无法共享问题
// 通知所有客户端有人上线了
ChannelContext.getChannels().forEach((existClientId, channels) -> {
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_CONNECTION_SUCCESS_NOTIFICATION);
nettyMsg.setData((JSON.toJSONString(clientIdList)
.getBytes(StandardCharsets.UTF_8)));
// 发送所有客户端ID
for (Channel channel : channels) {
channel.writeAndFlush(nettyMsg);
}
});
// 开始开启客户端:【{}】,端口映射
log.info("Start opening client: [{}], port mapping", clientId);
// 创建访问者(内网穿透连接创建)
lazyInternalNetworkServerPermeateClientMappingApplication.createVisitor(clientId);
// 结束开启客户端:【{}】,端口映射
log.info("End opening client: [{}], port mapping", clientId);
}else {
// 关闭通道
log.warn("无法认证客户端:【{}】",clientId);
newChannel.close();
}
// TODO 多副本本地channel 无法共享问题
// 通知所有客户端有人上线了
ChannelContext.getChannels().forEach((existClientId, channels) -> {
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_CONNECTION_SUCCESS_NOTIFICATION);
nettyMsg.setData((JSON.toJSONString(clientIdList)
.getBytes(StandardCharsets.UTF_8)));
// 发送所有客户端ID
for (Channel channel : channels) {
channel.writeAndFlush(nettyMsg);
}
});
// 开始开启客户端:【{}】,端口映射
log.info("Start opening client: [{}], port mapping", clientId);
// 创建访问者(内网穿透连接创建)
lazyInternalNetworkServerPermeateClientMappingApplication.createVisitor(clientId);
// 结束开启客户端:【{}】,端口映射
log.info("End opening client: [{}], port mapping", clientId);
} else {
// 黑名单客户端

View File

@ -2,15 +2,16 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced;
import io.netty.channel.Channel;
import io.netty.channel.ChannelId;
import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
import org.framework.lazy.cloud.network.heartbeat.common.MessageType;
import org.framework.lazy.cloud.network.heartbeat.common.NettyClientVisitorContext;
import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.server.AbstractHandleReportDisconnectTypeAdvanced;
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
import org.framework.lazy.cloud.network.heartbeat.server.netty.socket.NettyServerPermeateClientVisitorSocket;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
import org.springframework.stereotype.Component;
import org.wu.framework.core.utils.ObjectUtils;
@ -40,14 +41,21 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo
@Override
public void doHandler(Channel deathChannel, NettyProxyMsg msg) {
// 关闭连接通知
byte[] clientId = msg.getClientId();
log.warn("close client :{} channel", new String(clientId));
String clientId = msg.getClientIdString();
log.warn("close client :{} channel", clientId);
Channel deathClientChannelDTO = ChannelContext.getLoadBalance(clientId);
String appKey = ChannelAttributeKeyUtils.getAppKey(deathChannel);
String appSecret = ChannelAttributeKeyUtils.getAppSecret(deathChannel);
String originalIp = ChannelAttributeKeyUtils.getOriginalIp(deathChannel);
if (deathClientChannelDTO != null) {
// 服务状态离线
String tenantId = new String(clientId);
lazyClientStatsChangeApplication.clientOffLine(tenantId);
LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand();
lazyNettyClientLoginCommand.setClientId(clientId);
lazyNettyClientLoginCommand.setAppKey(appKey);
lazyNettyClientLoginCommand.setAppSecret(appSecret);
lazyNettyClientLoginCommand.setOriginalIp(originalIp);
lazyClientStatsChangeApplication.clientOffLine(lazyNettyClientLoginCommand);
ChannelContext.remove(clientId);
// 通知其他客户端 channelId 关闭了
@ -57,12 +65,12 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_DISCONNECTION_NOTIFICATION);
nettyMsg.setClientId(clientId);
nettyMsg.setData(clientId);
nettyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8));
channel.writeAndFlush(nettyMsg);
// 暂存通知
NettyProxyMsg stagingNettyProxyMsg = new NettyProxyMsg();
stagingNettyProxyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);
stagingNettyProxyMsg.setData(clientId);
stagingNettyProxyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8));
stagingNettyProxyMsg.setClientId(clientId);
channel.writeAndFlush(stagingNettyProxyMsg);
}

View File

@ -3,7 +3,9 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced;
import io.netty.channel.Channel;
import io.netty.channel.ChannelId;
import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
import org.springframework.stereotype.Component;
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
import org.framework.lazy.cloud.network.heartbeat.common.MessageType;
@ -33,13 +35,23 @@ public class ServerHandleReportStagingClosedTypeAdvanced extends AbstractHandleR
*/
@Override
protected void doHandler(Channel stagingClosedChannel, NettyProxyMsg msg) {
String appKey = ChannelAttributeKeyUtils.getAppKey(stagingClosedChannel);
String appSecret = ChannelAttributeKeyUtils.getAppSecret(stagingClosedChannel);
String originalIp = ChannelAttributeKeyUtils.getOriginalIp(stagingClosedChannel);
byte[] clientIdBytes = msg.getClientId();
// 获取所有通道
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
if (stagingOpenedClientChannel != null) {
String clientId = new String(clientIdBytes);
// 存储当前客户端暂存关闭
lazyClientStatsChangeApplication.stagingClosed(clientId);
LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand();
lazyNettyClientLoginCommand.setClientId(clientId);
lazyNettyClientLoginCommand.setAppKey(appKey);
lazyNettyClientLoginCommand.setAppSecret(appSecret);
lazyNettyClientLoginCommand.setOriginalIp(originalIp);
lazyClientStatsChangeApplication.stagingClosed(lazyNettyClientLoginCommand);
ChannelContext.getChannels().forEach((existClientId, channels) -> {
for (Channel channel : channels) {
// 告诉他们 当前参数这个通道 暂存关闭了

View File

@ -6,7 +6,9 @@ import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
import org.framework.lazy.cloud.network.heartbeat.common.MessageType;
import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.server.AbstractHandleReportStagingOpenedTypeAdvanced;
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
@ -35,13 +37,21 @@ public class ServerHandleReportStagingOpenedTypeAdvanced extends AbstractHandleR
protected void doHandler(Channel stagingOpenedChannel, NettyProxyMsg msg) {
// 获取所有通道
byte[] clientIdBytes = msg.getClientId();
String appKey = ChannelAttributeKeyUtils.getAppKey(stagingOpenedChannel);
String appSecret = ChannelAttributeKeyUtils.getAppSecret(stagingOpenedChannel);
String originalIp = ChannelAttributeKeyUtils.getOriginalIp(stagingOpenedChannel);
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
if (stagingOpenedClientChannel != null) {
ChannelContext.getChannels().forEach((existClientId, channels) -> {
for (Channel channel : channels) {
// 存储当前客户端暂存关闭
String clientId = new String(clientIdBytes);
lazyClientStatsChangeApplication.stagingOpened(clientId);
LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand();
lazyNettyClientLoginCommand.setClientId(clientId);
lazyNettyClientLoginCommand.setAppKey(appKey);
lazyNettyClientLoginCommand.setAppSecret(appSecret);
lazyNettyClientLoginCommand.setOriginalIp(originalIp);
lazyClientStatsChangeApplication.stagingOpened(lazyNettyClientLoginCommand);
// 告诉他们 当前参数这个通道 暂存开启了
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);

View File

@ -1,5 +1,7 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
/**
* 云下心跳客户端操作 nacos 配置
*/
@ -9,30 +11,30 @@ public interface LazyClientStatsChangeApplication {
/**
* 客户端在线
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端状态
*/
void clientOnLine(String clientId);
void clientOnLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand);
/**
* 客户端离线
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端状态
*/
void clientOffLine(String clientId);
void clientOffLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand);
/**
* 客户端暂存关闭
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端状态
*/
void stagingClosed(String clientId);
void stagingClosed(LazyNettyClientLoginCommand lazyNettyClientLoginCommand);
/**
* 客户端暂存开启
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端状态
*/
void stagingOpened(String clientId);
void stagingOpened(LazyNettyClientLoginCommand lazyNettyClientLoginCommand);
}

View File

@ -1,7 +1,6 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
import org.wu.framework.web.response.Result;
import org.wu.framework.web.response.ResultFactory;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketRemoveCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketStoryCommand;
@ -106,4 +105,13 @@ public interface LazyNettyClientTokenBucketApplication {
Result<LazyNettyClientTokenBucket> remove(LazyNettyClientTokenBucketRemoveCommand lazyNettyClientTokenBucketRemoveCommand);
/**
* 认证验证
*
* @param clientId 客户端ID
* @param appKey key
* @param appSecret 令牌
* @return 布尔类型
*/
Result<Boolean> certificationToken(String clientId, String appKey, String appSecret);
}

View File

@ -0,0 +1,76 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import org.framework.lazy.cloud.network.heartbeat.common.enums.NettyClientStatus;
import org.wu.framework.lazy.orm.core.persistence.reverse.lazy.ddd.DefaultDDDLazyStoryCommand;
import java.time.LocalDateTime;
/**
* describe 客户端登陆信息
*
* @author Jia wei Wu
* @date 2023/12/27 03:46 下午
* @see DefaultDDDLazyStoryCommand
**/
@Data
@Accessors(chain = true)
@Schema(title = "lazy_netty_client_login_command", description = "客户端登陆信息")
public class LazyNettyClientLoginCommand {
/**
* 客户端ID
*/
@Schema(description = "客户端ID", name = "clientId", example = "")
private String clientId;
/**
* 创建时间
*/
@Schema(description = "创建时间", name = "createTime", example = "")
private LocalDateTime createTime;
/**
* 在线状态true在线false离线
*/
@Schema(description = "在线状态true在线false离线", name = "onLineState", example = "")
private NettyClientStatus onLineState;
/**
* 暂存状态(开启、关闭)
*/
@Schema(description = "暂存状态(开启、关闭)", name = "staging", example = "")
private String stagingState;
/**
* 服务端ID
*/
@Schema(description = "服务端ID", name = "serverId", example = "")
private String serverId;
/**
* 令牌key
* byte[] 长度 4
*
* @since 1.2.8
*/
private String appKey;
/**
* 令牌密钥
* byte[] 长度 4
*
* @since 1.2.9
*/
private String appSecret;
/**
* 原始IP
* byte[] 长度 4
*
* @since 1.2.9
*/
private String originalIp;
}

View File

@ -29,7 +29,8 @@ public class LazyNettyClientMessageCommand {
* 发送的消息
*/
@Schema(description = "发送的消息", name = "message", example = "")
private String message; /**
private String message;
/**
* 服务端ID
*/
@Schema(description = "服务端ID", name = "serverId", example = "")

View File

@ -3,6 +3,7 @@ package org.framework.lazy.cloud.network.heartbeat.server.standalone.application
import org.framework.lazy.cloud.network.heartbeat.server.properties.ServerNodeProperties;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.LazyNettyClientState;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecord;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecordRepository;
@ -46,10 +47,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
/**
* 客户端在线
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端ID
*/
@Override
public void clientOnLine(String clientId) {
public void clientOnLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
String clientId = lazyNettyClientLoginCommand.getClientId();
// 如果可以已经在线状态不推送
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
// stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.ON_LINE.name());
@ -70,10 +72,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
/**
* 客户端离线
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端ID
*/
@Override
public void clientOffLine(String clientId) {
public void clientOffLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
String clientId = lazyNettyClientLoginCommand.getClientId();
// 如果可以已经在线状态不推送
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
// stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.OFF_LINE.name());
@ -89,7 +92,7 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
storyClientStateRecord(clientId,serverId,NettyClientStatus.OFF_LINE.name(),null);
// // 触发暂存扫描
// ClientOnLineState clientOnLineState = new ClientOnLineState();
// clientOnLineState.setClientId(clientId);
// clientOnLineState.setClientId(lazyNettyClientLoginCommand);
// clientOnLineState.setOnLineState(NettyClientStatus.OFF_LINE.name());
// stringRedisTemplate.convertAndSend(REDIS_CLIENT_ONLINE_OR_OFFLINE_CHANNEL,clientOnLineState);
@ -98,10 +101,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
/**
* 客户端暂存关闭
*
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand 客户端ID
*/
@Override
public void stagingClosed(String clientId) {
public void stagingClosed(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
String clientId = lazyNettyClientLoginCommand.getClientId();
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
lazyNettyClientState.setClientId(clientId);
lazyNettyClientState.setStagingState("CLOSED");
@ -114,10 +118,12 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
/**
* 客户端暂存开启
*
* @param clientId 客户端ID
* @param clientId 客户端ID
* @param lazyNettyClientLoginCommand
*/
@Override
public void stagingOpened(String clientId) {
public void stagingOpened(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
String clientId = lazyNettyClientLoginCommand.getClientId();
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
lazyNettyClientState.setClientId(clientId);
lazyNettyClientState.setStagingState("OPENED");

View File

@ -143,4 +143,16 @@ public class LazyNettyClientTokenBucketApplicationImpl implements LazyNettyClien
return lazyNettyClientTokenBucketRepository.remove(lazyNettyClientTokenBucket);
}
/**
* 认证验证
*
* @param clientId 客户端ID
* @param appKey key
* @param appSecret 令牌
* @return 布尔类型
*/
@Override
public Result<Boolean> certificationToken(String clientId, String appKey, String appSecret) {
return lazyNettyClientTokenBucketRepository.certificationToken(clientId,appKey,appSecret);
}
}

View File

@ -103,4 +103,13 @@ public interface LazyNettyClientTokenBucketRepository {
Result<Boolean> exists(LazyNettyClientTokenBucket lazyNettyClientTokenBucket);
/**
* 认证验证
*
* @param clientId 客户端ID
* @param appKey key
* @param appSecret 令牌
* @return 布尔类型
*/
Result<Boolean> certificationToken(String clientId, String appKey, String appSecret);
}

View File

@ -8,10 +8,12 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu
import org.springframework.stereotype.Repository;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyWrappers;
import org.wu.framework.web.response.Result;
import org.wu.framework.web.response.ResultFactory;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@ -144,4 +146,50 @@ public class LazyNettyClientTokenBucketRepositoryImpl implements LazyNettyClient
return ResultFactory.successOf(exists);
}
/**
* 认证验证
*
* @param clientId 客户端ID
* @param appKey key
* @param appSecret 令牌
* @return 布尔类型
*/
@Override
public Result<Boolean> certificationToken(String clientId, String appKey, String appSecret) {
// 验证客户端与令牌
boolean exists = lazyLambdaStream.exists(LazyWrappers
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
.eq(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId)
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
);
if (exists) {
return ResultFactory.successOf(true);
}
// 验证令牌是否未被占用
boolean hasCanUseToken = lazyLambdaStream.exists(LazyWrappers
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
.isNull(LazyNettyClientTokenBucketDO::getUsedByClientId)
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
);
if (hasCanUseToken) {
// 绑定客户端ID
lazyLambdaStream.update(
LazyUpdateSetValueWrappers.<LazyNettyClientTokenBucketDO>lambdaWrapper()
.set(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId)
.set(LazyNettyClientTokenBucketDO::getUpdateTime, LocalDateTime.now())
,
LazyWrappers
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
);
return ResultFactory.successOf(true);
}
return ResultFactory.successOf(false);
}
}