// +---------------------------------------------------------------------- namespace plugin\saiadmin\app\middleware; use Webman\Http\Request; use Webman\Http\Response; use Webman\MiddlewareInterface; use Tinywan\Jwt\JwtToken; use plugin\saiadmin\app\cache\ReflectionCache; use plugin\saiadmin\exception\ApiException; /** * 登录检查中间件 */ class CheckLogin implements MiddlewareInterface { public function process(Request $request, callable $handler): Response { // 通过反射获取控制器哪些方法不需要登录 $noNeedLogin = ReflectionCache::getNoNeedLogin($request->controller); // 访问的方法需要登录 if (!in_array($request->action, $noNeedLogin)) { try { $token = JwtToken::getExtend(); } catch (\Throwable $e) { throw new ApiException('您的登录凭证错误或者已过期,请重新登录', 401); } if ($token['plat'] !== 'saiadmin') { throw new ApiException('登录凭证校验失败'); } // 一次合并设置,避免 setHeader 覆盖导致只保留最后一个 $request->setHeader(array_merge($request->header() ?: [], [ 'check_login' => true, 'check_admin' => $token, ])); } return $handler($request); } }