請(qǐng)求攔截
EasySwoole
的控制器并沒(méi)有提供類似中間件的說(shuō)法,而是提供了控制器中的 onRequest
事件進(jìn)行驗(yàn)證。
例如,我們需要對(duì) /api/user/*
下的路徑進(jìn)行 cookie
驗(yàn)證。那么有以下兩種方案:
全局 Request 及 Response 事件
在 全局 Initialize 事件 中注冊(cè).
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');
// 對(duì) cookie 進(jìn)行判斷,比如在數(shù)據(jù)庫(kù)或者是 redis 緩存中,存在該 cookie 信息,說(shuō)明用戶登錄成功
$isLogin = true;
if ($isLogin) {
// 返回 true 表示繼續(xù)往下執(zhí)行控制器 action
return true;
} else {
// 這一步可以給前端響應(yīng)數(shù)據(jù),告知前端未登錄
$data = Array(
"code" => 200,
"result" => null,
"msg" => '請(qǐng)先登錄'
);
$response->withHeader('Content-Type', 'application/json;charset=utf-8');
$response->withStatus(200);
$response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
// 返回 false 表示不繼續(xù)往下執(zhí)行控制器 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
版本之前:可在項(xiàng)目根目錄的 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');
// 對(duì) cookie 進(jìn)行判斷,比如在數(shù)據(jù)庫(kù)或者是 redis 緩存中,存在該 cookie 信息,說(shuō)明用戶登錄成功
$isLogin = true;
if ($isLogin) {
// 返回 true 表示繼續(xù)往下執(zhí)行控制器 action
return true;
} else {
// 這一步可以給前端響應(yīng)數(shù)據(jù),告知前端未登錄
$this->writeJson(401, null, '請(qǐng)先登錄');
// 返回 false 表示不繼續(xù)往下執(zhí)行控制器 action
return false;
}
}
}
后續(xù),只要 /api/user/*
路徑下的控制器,都繼承自 Base
控制器,都可以自動(dòng)實(shí)現(xiàn)對(duì) cookie
攔截了
行為權(quán)限校驗(yàn)也是如此,可以判斷某個(gè)用戶是否對(duì)該控制器的
action
或者請(qǐng)求路徑有沒(méi)有權(quán)限