// +---------------------------------------------------------------------- namespace plugin\saiadmin\app\middleware; use plugin\saiadmin\app\cache\UserInfoCache; use ReflectionClass; use Webman\Http\Request; use Webman\Http\Response; use Webman\MiddlewareInterface; use Tinywan\Jwt\JwtToken; use plugin\saiadmin\exception\ApiException; /** * 登录检查中间件 */ class CheckLogin implements MiddlewareInterface { public function process(Request $request, callable $handler): Response { // 通过反射获取控制器哪些方法不需要登录 $controller = new ReflectionClass($request->controller); $noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? []; // 访问的方法需要登录 if (!in_array($request->action, $noNeedLogin)) { try { $token = JwtToken::getExtend(); // 根据用户id获取用户权限 $userAuthCache = new UserInfoCache($token['id']); $user_info = $userAuthCache->getUserInfo(); if($user_info['status']===0){ throw new ApiException('您的账号已禁用,请联系管理员', 401); } $request->setHeader('user_info', $user_info); $request->setHeader('check_login', true); $request->setHeader('check_admin', $token); } catch (\Throwable $e) { throw new ApiException('您的登录凭证错误或者已过期,请重新登录', 401); } } return $handler($request); } }