workman服务端开发模式-应用开发-gateway的onWebSocketConnect开发

一、onWebSocketConnect安全开发一

为什么叫安全开发一,是因为还有两种情况没有考虑好,需要实测中进行修改。第一种情况:个人如果打开两个窗口,访问同一个系统或个人如果打开两种浏览器,两个窗口同时访问一个系统,改怎么解决。第二种情况:如果有人用工具的情况下,怎么才能断开连接。安全一的代码如下:

复制代码
    /**
     * 专门处理安全的
     * User: 龙哥·三年风水
     * Date: 2024/12/16
     * Time: 17:03
     * @ param $client_id
     * @ param $data
     */
    public static function onWebSocketConnect($client_id,$data){
        // 没有指定参数的情况下
        if(!isset($data['get']['token']) || !isset($data['get']['extremity_type']) || !isset($data['get']['login_time'])){
            //释放当前连接
            Gateway::destoryClient($client_id);
            exit;
        }
        $token = $data['get']['token'];
        $extremityType = $data['get']['extremity_type'];
        $loginTime = $data['get']['login_time'];
        // 有参数且参数值不合法的情况下
        if(empty($token) || !in_array($extremityType,[1,2,3]) || preg_match('/^\d{10}$/', $loginTime) == false){
            //释放当前连接
            Gateway::destoryClient($client_id);
            exit;
        }
        // 读取Redis配置及Redis连接
        $config = parse_ini_file('conf.ini', true);
        $redis = new Client("redis://{$config['redis']['host']}:{$config['redis']['port']}");
        $redis->auth($config['redis']['password']);
        // 平台端验证
        if($extremityType == 1){
            $redis->select((int)$config['redis']['login_ip']);
            // 验证IP是否合法
            $redis->get($token,function($clientIp) use ($client_id,$data){
                if(empty($clientIp)){
                    //释放当前连接
                    Gateway::destoryClient($client_id);
                    exit;
                }
                if($clientIp != $data['server']['HTTP_X_REAL_IP']){
                    //释放当前连接
                    Gateway::destoryClient($client_id);
                    exit;
                }
            });
            // 验证是否登录
            $redis->select((int)$config['redis']['token_platform']);
            $authorization = sha1(sha1($token).$loginTime);
            $redis->get('token_'.$authorization,function ($tokenValue) use ($client_id,$config){
                if(empty($tokenValue)){
                    //释放当前连接
                    Gateway::destoryClient($client_id);
                    exit;
                }
                Gateway::bindUid($client_id,$tokenValue);
                Gateway::joinGroup($client_id,'platform'.$config['redis']['token_platform']);
            });

        }
    }

二、提前说明

明天将完成流程图及规则说明后再次开发websocket安全。

相关推荐
boy快快长大9 小时前
【Spring Cloud Alibaba】Gateway(一)
数据库·gateway
霸王大陆9 小时前
《零基础学 PHP:从入门到实战》模块十:从应用到精通——掌握PHP进阶技术与现代化开发实战-3
开发语言·php
JIAWAP9 小时前
Redis数据安全性分析之RDB详解
数据库·redis·分布式·缓存
霸王大陆10 小时前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-5
数据库·mysql·php
唐僧洗头爱飘柔952710 小时前
【区块链技术(04)】区块链核心技术:分布式网络的定义和特点;分布式账本的特性、实现与工作流程;共识机制
网络·分布式·区块链·共识算法·分布式账本·共识机制
松☆10 小时前
OpenHarmony + Flutter 混合开发进阶:实现跨设备分布式数据同步与状态共享
分布式·flutter
沧海寄馀生10 小时前
Apache Hadoop生态组件部署分享-Kafka
大数据·hadoop·分布式·kafka·apache
ljh57464911910 小时前
thinkphp8 执行 php think 命令的时候指定日志存储路径
php
●VON10 小时前
跨设备状态同步实战:基于 HarmonyOS 分布式数据管理(DDM)构建多端协同应用
分布式·学习·华为·harmonyos·openharmony·von
无心水10 小时前
【分布式利器:大厂技术】5、华为分布式方案:国产化适配+政企高可靠,鲲鹏/昇腾生态核心技术
分布式·华为·gaussdb·分布式利器·华为分布式·国产化数据库·政企高可靠