AuthMiddleware.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\middleware;
  4. use app\service\PermissionService;
  5. class AuthMiddleware
  6. {
  7. /**
  8. * 处理请求
  9. */
  10. public function handle($request, \Closure $next)
  11. {
  12. // 获取当前控制器和操作
  13. $controller = $request->controller();
  14. $action = $request->action();
  15. // 检查是否在登录白名单中(不需要登录验证)
  16. if (PermissionService::isInLoginWhitelist($controller, $action)) {
  17. return $next($request);
  18. }
  19. // 验证登录状态
  20. $userInfo = $this->checkLogin($request);
  21. if (!$userInfo) {
  22. return json_error([], '请先登录', 401);
  23. }
  24. // 将用户信息注入请求
  25. $request->userInfo = $userInfo;
  26. $request->userId = (int)$userInfo['user_id'];
  27. // 检查是否在权限白名单中(需要登录但不需要权限验证)
  28. if (PermissionService::isInPermissionWhitelist($controller, $action)) {
  29. return $next($request);
  30. }
  31. // 验证权限
  32. if (!PermissionService::checkPermission((int)$userInfo['user_id'], $controller, $action)) {
  33. return json_error([], '无权限访问', 403);
  34. }
  35. return $next($request);
  36. }
  37. /**
  38. * 检查登录状态
  39. */
  40. protected function checkLogin($request): ?array
  41. {
  42. $token = $request->cookie('auth_token');
  43. if (!$token) {
  44. return null;
  45. }
  46. $decoded = parseToken($token);
  47. if (!$decoded) {
  48. return null;
  49. }
  50. return $decoded;
  51. }
  52. }