请求拦截
Easyswoole的控制器并没有提供类似中间件的说法,而是提供了控制器中的onRequest
事件进行验证。
例如,我们需要对/api/user/*
下的路径进行cookie验证。那么有以下两种方案.
全局Request及Response事件
在initialize中注册.
// 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 = $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;
}
});
// 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){
});
3.4.x版本之前:可在EasySwooleEvent
中看到onRequest
及afterRequest
方法.
定义Base控制器
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或者请求路径有没有权限