mirror of
https://gitee.com/wujiawei1207537021/wu-lazy-cloud-network.git
synced 2025-06-16 18:35:05 +08:00
[fix] 通道数据添加appKey、appSecret、originalIp验证
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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 {
|
||||
// 黑名单客户端
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
// 告诉他们 当前参数这个通道 暂存关闭了
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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 = "")
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user