請求攔截
EasySwoole
的控制器并沒有提供類似中間件的說法,而是提供了控制器中的 onRequest
事件進行驗證。
例如,我們需要對 /api/user/*
下的路徑進行 cookie
驗證。那么有以下兩種方案:
全局 Request 及 Response 事件
在 全局 Initialize 事件 中注冊.
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
// onRequest v3.4.x+
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
$cookie = $request->getCookieParams('user_cookie');
// 對 cookie 進行判斷,比如在數據庫或者是 redis 緩存中,存在該 cookie 信息,說明用戶登錄成功
$isLogin = true;
if ($isLogin) {
// 返回 true 表示繼續往下執行控制器 action
return true;
} else {
// 這一步可以給前端響應數據,告知前端未登錄
$data = Array(
"code" => 200,
"result" => null,
"msg" => '請先登錄'
);
$response->withHeader('Content-Type', 'application/json;charset=utf-8');
$response->withStatus(200);
$response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
// 返回 false 表示不繼續往下執行控制器 action
return false;
}
});
// afterRequest v3.4.x+
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_AFTER_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
});
}
EasySwoole 3.4.x
版本之前:可在項目根目錄的 EasySwooleEvent.php
中看到 onRequest
及 afterRequest
方法。
定義 Base 控制器
<?php
namespace App\HttpController\Api\User;
use EasySwoole\Http\AbstractInterface\Controller;
abstract class Base extends Controller
{
protected function onRequest(?string $action): ?bool
{
$cookie = $this->request()->getCookieParams('user_cookie');
// 對 cookie 進行判斷,比如在數據庫或者是 redis 緩存中,存在該 cookie 信息,說明用戶登錄成功
$isLogin = true;
if ($isLogin) {
// 返回 true 表示繼續往下執行控制器 action
return true;
} else {
// 這一步可以給前端響應數據,告知前端未登錄
$this->writeJson(401, null, '請先登錄');
// 返回 false 表示不繼續往下執行控制器 action
return false;
}
}
}
后續,只要 /api/user/*
路徑下的控制器,都繼承自 Base
控制器,都可以自動實現對 cookie
攔截了
行為權限校驗也是如此,可以判斷某個用戶是否對該控制器的
action
或者請求路徑有沒有權限