AccessControl.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. namespace plugin\admin\app\middleware;
  3. use plugin\admin\api\Auth;
  4. use ReflectionException;
  5. use support\exception\BusinessException;
  6. use Webman\Http\Request;
  7. use Webman\Http\Response;
  8. use Webman\MiddlewareInterface;
  9. class AccessControl implements MiddlewareInterface
  10. {
  11. /**
  12. * @param Request $request
  13. * @param callable $handler
  14. * @return Response
  15. * @throws ReflectionException|BusinessException
  16. */
  17. public function process(Request $request, callable $handler): Response
  18. {
  19. $controller = $request->controller;
  20. $action = $request->action;
  21. $code = 0;
  22. $msg = '';
  23. if (!Auth::canAccess($controller, $action, $code, $msg)) {
  24. if ($request->expectsJson()) {
  25. $response = json(['code' => $code, 'msg' => $msg, 'data' => []]);
  26. } else {
  27. if ($code === 401) {
  28. $response = response(<<<EOF
  29. <script>
  30. if (self !== top) {
  31. parent.location.reload();
  32. }
  33. </script>
  34. EOF
  35. );
  36. } else {
  37. $request->app = '';
  38. $request->plugin = 'admin';
  39. $response = view('common/error/403')->withStatus(403);
  40. }
  41. }
  42. } else {
  43. $response = $request->method() == 'OPTIONS' ? response('') : $handler($request);
  44. }
  45. return $response;
  46. }
  47. }