在 Laravel 12 中實現 WebSocket 通信時進行身份驗證

在 Laravel 12 中實現 WebSocket 通信時,若需在身份驗證失敗后主動斷開客戶端連接,需結合 頻道認證機制服務端主動斷連操作。以下是具體實現步驟:


一、身份驗證流程設計

WebSocket 連接的身份驗證通常通過 私有頻道(Private Channel)存在頻道(Presence Channel) 實現。以下是核心流程:

  1. 客戶端發起訂閱請求
    // 前端訂閱私有頻道
    Echo.private('chat.1').listen('NewMessage', (data) => { /* ... */ });
    
  2. 服務端驗證權限
    • Laravel 自動觸發 routes/channels.php 中的頻道授權邏輯。
    • 若驗證失敗,返回 403 Forbidden,并觸發斷連操作。

二、實現身份驗證失敗斷連

方案 1:使用 Laravel Reverb(官方方案)

Reverb 默認在頻道認證失敗時拒絕訂閱,但不會主動斷開連接。需通過以下方式強制斷連:

  1. 自定義認證中間件

    • 創建中間件 VerifyWebSocketAuth
      php artisan make:middleware VerifyWebSocketAuth
      
    • 編輯中間件邏輯:
      <?php
      namespace App\Http\Middleware;
      use Closure;
      use Illuminate\Support\Facades\Auth;class VerifyWebSocketAuth {public function handle($request, Closure $next) {if (!Auth::check()) { // 身份驗證失敗// 返回 403 并關閉連接abort(403, 'Unauthorized');}return $next($request);}
      }
      
  2. 將中間件應用到廣播路由

    • 修改 app/Providers/BroadcastServiceProvider.php
      public function boot() {Broadcast::routes(['middleware' => ['web', 'auth:api', VerifyWebSocketAuth::class]]);
      }
      
  3. 前端處理斷連

    Echo.private('chat.1').listen('NewMessage', (data) => { /* ... */ }).error((error) => {console.error('連接被拒絕:', error);Echo.disconnect(); // 主動斷開連接});
    

方案 2:使用 Soketi(Pusher 替代)

Soketi 作為 Pusher 協議兼容服務,可通過 自定義授權端點 實現強制斷連:

  1. 配置自定義授權端點
    • .env 中指定授權路由:
      PUSHER_APP_AUTHORIZER=http://your-app.test/broadcasting/auth
      
  2. 自定義授權響應
    • routes/api.php 中定義嚴格認證邏輯:
      use Illuminate\Support\Facades\Broadcast;Broadcast::channel('chat.{userId}', function ($user, $userId) {if ($user->id !== (int) $userId) {// 返回 403 并附帶斷連指令return response()->json(['error' => 'Forbidden'], 403)->header('Connection', 'close');}return true;
      });
      

方案 3:使用 Workerman/Swoole(底層控制)

若需直接操作 WebSocket 連接,可通過 Workerman/Swoole 的底層 API 強制斷連:

  1. 保存客戶端連接標識
    • 在連接建立時記錄客戶端 ID(如 fd):
      $worker->onConnect = function ($connection) {$connection->id = uniqid();Cache::put('ws_connections.' . $connection->id, $connection);
      };
      
  2. 認證失敗時主動斷連
    $worker->onMessage = function ($connection, $data) {$user = Auth::user();if (!$user) {// 發送錯誤消息并關閉連接$connection->send(json_encode(['error' => 'Unauthorized']));$connection->close();return;}// 正常處理消息
    };
    

三、生產環境優化

  1. 日志記錄
    // 在中間件或事件中記錄斷連行為
    Log::warning('WebSocket 連接因認證失敗被關閉', ['ip' => request()->ip(),'time' => now()
    ]);
    
  2. 速率限制
    • app/Providers/RouteServiceProvider.php 中限制認證請求頻率:
      RateLimiter::for('websocket-auth', function (Request $request) {return Limit::perMinute(30);
      });
      

四、完整示例代碼

服務端(Laravel Reverb)
  1. 頻道授權文件 (routes/channels.php):
    Broadcast::channel('chat.{userId}', function ($user, $userId) {if ($user->id !== (int) $userId) {// 拋出異常觸發斷連throw new \Exception('身份驗證失敗');}return true;
    });
    
  2. 全局異常處理 (app/Exceptions/Handler.php):
    public function register() {$this->renderable(function (\Exception $e, $request) {if ($e->getMessage() === '身份驗證失敗') {return response()->json(['error' => 'Forbidden'], 403)->header('Connection', 'close');}});
    }
    

客戶端(Laravel Echo)
// 監聽連接錯誤
Echo.connector.pusher.connection.bind('error', (error) => {if (error.status === 403) {Echo.disconnect();alert('身份驗證失敗,連接已關閉');}
});

五、關鍵注意事項

  1. 協議兼容性
    • 使用 wss:// 協議時確保 SSL 證書有效。
  2. 連接狀態同步
    • 使用 Redis 或數據庫跟蹤在線用戶狀態。
  3. 測試工具
    • 使用 WebSocket KingPostman 手動測試斷連邏輯。

通過以上方案,可以在 Laravel 12 中實現 WebSocket 通信時的嚴格身份驗證,確保驗證失敗時主動斷開連接,提升系統安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78661.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78661.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FPGA----基于ZYNQ 7020實現petalinux并運行一個程序

引言&#xff1a;上一節我們講到了使用Alinx 7020b自帶的sd卡中的petalinux進行epics的編譯&#xff0c;但此種方案個性化程度不足。如&#xff1a;我們項目需要FPGA側的配合&#xff0c;那么我們需要重新編譯petalinx。 注意&#xff1a;本文的知識點來自下面兩篇文章&#x…

Spring Web MVC————入門(1)

今天開始正式帶大家學習Spring部分的內容了&#xff0c;大家嘗試去弄個專業版嗷&#xff0c;學習起來爽一點 在idea中下載這個插件就行了 我們之后開始創建Spring項目&#xff0c; 藍色 部分自己起名&#xff0c;type選Maven&#xff0c;其他的默認就好了&#xff0c;之后nex…

Vue3 中用 canvas 封裝抽獎轉盤組件:設定中獎概率及獎項圖標和名稱

在 Web 應用開發中&#xff0c;抽獎功能是提升用戶參與度的常用手段。使用 Vue3 結合 canvas 技術&#xff0c;我們可以輕松實現一個高度自定義的抽獎轉盤組件&#xff0c;不僅能設定中獎概率&#xff0c;還能靈活配置獎項圖標和名稱。本文將詳細介紹該組件的實現原理、步驟&am…

Linux 硬盤和光驅系統管理

一、硬盤與目錄的容量 [rootwww ~]# df [-ahikHTm] [目錄或檔名] 選項與參數&#xff1a; -a &#xff1a;列出所有的檔案系統&#xff0c;包括系統特有的 /proc 等檔案系統&#xff1b; -k &#xff1a;以 KBytes 的容量顯示各檔案系統&#xff1b; -m &#xff1a;以 MByt…

2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用戶&#xff1a;優先使用Caffeine&#xff0c;性能更優且維護活躍。 1. 添加依賴 在pom.xml中添加Guava依賴&#xff1a; <dependency><groupId>com.google.guava</groupId&…

黑馬點評day02(緩存)

2、商戶查詢緩存 2.1 什么是緩存? 前言:什么是緩存? 就像自行車,越野車的避震器 舉個例子:越野車,山地自行車,都擁有"避震器",防止車體加速后因慣性,在酷似"U"字母的地形上飛躍,硬著陸導致的損害,像個彈簧一樣; 同樣,實際開發中,系統也需要"避震…

頭歌禁止復制怎么解除(簡單版)

被頭歌數據庫作業禁止復制整神之后&#xff0c;主啵嘗試網上各種解除方法&#xff0c;最后發現一個最簡單且最快速的解除方法。 在瀏覽器中搜索萬能復制插件 下載完成之后就可以隨便復制粘貼啦 超簡單 下載只需幾秒

【無基礎】小白解決Docker pull時報錯:https://registry-1.docker.io/v2/

Docker Compose 啟動失敗問題解決方案 錯誤描述 執行 docker compose up -d 時出現以下錯誤&#xff1a; [] Running 9/9? api Error context canceled …

【數據結構】二叉樹、堆

文章目錄 二叉樹的概念及結構定義特殊的二叉樹核心性質存儲方式 二叉樹的鏈式存儲前序遍歷中序遍歷后序遍歷層序遍歷 二叉樹的順序存儲父子關系的推導堆&#xff08;heap&#xff09;堆的概念向上調整算法和向下調整算法向上調整算法向下調整算法 堆的創建堆的插入堆的刪除 堆的…

Vue3響應式原理那些事

文章目錄 1 響應式基礎:Proxy 與 Reflect1.1 Proxy 代理攔截1.2 Reflect 確保 `this` 指向正確1.2.1 修正 `this` 指向問題1.2.2 統一的操作返回值1.3 與 Vue2 的對比2 依賴收集與觸發機制2.1 全局依賴存儲結構:WeakMap → Map → Set2.2 依賴收集觸發時機2.3 依賴收集核心實…

精選10個好用的WordPress免費主題

10個好用的WordPress免費主題 1. Astra Astra 是全球最受歡迎的WordPress免費主題。它功能豐富&#xff0c;易于使用&#xff0c;SEO友好&#xff0c;是第一個安裝量突破100萬的非默認主題&#xff0c;并獲得了5000多個五星好評。 它完美集成了Elementor、Beaver&#xff0c;…

【SaaS多租架構】數據隔離與性能平衡

SaaS多租戶架構:數據隔離與性能平衡 一、技術背景及發展二、技術特點:數據隔離與性能優化的雙核心三、技術細節:實現路徑與關鍵技術四、實際案例分析五、未來發展趨勢結語一、技術背景及發展 多租戶架構是云計算與SaaS(軟件即服務)模式的核心技術,其核心目標是通過共享基…

部署GM DC Monitor 一體化監控預警平臺

1&#xff09;首先在官網下載鏡像文件 廣目&#xff08;北京&#xff09;軟件有限公司廣目&#xff08;北京&#xff09;軟件有限公司https://www.gm-monitor.com/col.jsp?id1142&#xff09;其次進行部署安裝&#xff0c;教程如下&#xff1a; 1. 基礎環境要求 1) 系統&…

Webug4.0靶場通關筆記15- 第19關文件上傳(畸形文件)

目錄 第19關 文件上傳(畸形文件) 1.打開靶場 2.源碼分析 &#xff08;1&#xff09;客戶端源碼 &#xff08;2&#xff09;服務器源碼 3.滲透實戰 &#xff08;1&#xff09;構造腳本 &#xff08;2&#xff09;雙寫繞過 &#xff08;3&#xff09;訪問腳本 本文通過《…

架構思維:構建高并發讀服務_熱點數據查詢的架構設計與性能調優

文章目錄 一、引言二、熱點查詢定義與場景三、主從復制——垂直擴容四、應用內前置緩存4.1 容量上限與淘汰策略4.2 延遲刷新&#xff1a;定期 vs. 實時4.3 逃逸流量控制4.4 熱點發現&#xff1a;被動 vs. 主動 五、降級與限流兜底六、前端&#xff0f;接入層其他應對七、模擬壓…

寶塔面板運行docker的jenkins

1.在寶塔面板裝docker&#xff0c;以及jenkins 2.ip:端口訪問jenkins 3.獲取密鑰&#xff08;點擊日志&#xff09; 4.配置容器內的jdk和maven環境&#xff08;直接把jdk和maven文件夾放到jenkins容器映射的data文件下&#xff09; 點擊容器-->管理-->數據存儲卷--.把相…

C語言 ——— 函數

目錄 函數是什么 庫函數 學習使用 strcpy 庫函數 自定義函數 寫一個函數能找出兩個整數中的最大值 寫一個函數交換兩個整型變量的內容 牛刀小試 寫一個函數判斷一個整數是否是素數 寫一個函數判斷某一年是否是閏年 寫一個函數&#xff0c;實現一個整型有序數組的二分…

筆記本電腦升級計劃(2017———2025)

ThinkPad T470 (2017) vs ThinkBook 16 (2025) 完整性能對比報告 一、核心硬件性能對比 1. CPU性能對比&#xff08;i5-7200U vs Ultra9-285H&#xff09; 參數i5-7200U (2017)Ultra9-285H (2025)提升百分比核心架構2核4線程 (Skylake)16核16線程 (6P8E2LPE)700%核心數制程工…

具身系列——PPO算法實現CartPole游戲(強化學習)

完整代碼參考&#xff1a; https://gitee.com/chencib/ailib/blob/master/rl/ppo_cartpole.py 執行結果&#xff1a; 部分訓練得分&#xff1a; (sd) D:\Dev\traditional_nn\feiai\test\rl>python ppo_cartpole_v2_succeed.py Ep: 0 | Reward: 23.0 | Running: 2…

Python項目源碼60:電影院選票系統1.0(tkinter)

1.功能特點&#xff1a;通常選票系統應該允許用戶選擇電影、場次、座位&#xff0c;然后顯示總價和生成票據。好的&#xff0c;我得先規劃一下界面布局。 首先&#xff0c;應該有一個電影選擇的列表&#xff0c;可能用下拉菜單Combobox來實現。然后場次時間&#xff0c;可能用…