src/EventSubscriber/PortalReadOnlySubscriber.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\MerchantUser;
  4. use App\Entity\User;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Security\Core\Security;
  10. class PortalReadOnlySubscriber implements EventSubscriberInterface
  11. {
  12.     private Security $security;
  13.     public function __construct(Security $security)
  14.     {
  15.         $this->security $security;
  16.     }
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             KernelEvents::REQUEST => ['enforceReadOnlyPortal', -10],
  21.         ];
  22.     }
  23.     public function enforceReadOnlyPortal(RequestEvent $event): void
  24.     {
  25.         if (!$event->isMainRequest()) {
  26.             return;
  27.         }
  28.         $request $event->getRequest();
  29.         if (strpos($request->getPathInfo(), '/api/') !== 0) {
  30.             return;
  31.         }
  32.         $user $this->security->getUser();
  33.         if (!$user instanceof User) {
  34.             return;
  35.         }
  36.         if (!$user->isEnable() || ($user->getManageUser() && !$user->getManageUser()->isEnable())) {
  37.             throw new AccessDeniedHttpException('账户被锁定');
  38.         }
  39.         if ($request->isMethodSafe() || $user->getManageUser() || $this->security->isGranted('ROLE_SUPER_ADMIN')) {
  40.             return;
  41.         }
  42.         $reason $this->readOnlyReason($user);
  43.         if ($reason) {
  44.             throw new AccessDeniedHttpException($reason);
  45.         }
  46.     }
  47.     private function readOnlyReason(User $user): ?string
  48.     {
  49.         $proxyUser $user->getProxyUser();
  50.         if ($proxyUser && !$proxyUser->isEnable()) {
  51.             return '当前代理已被禁用,仅允许查看数据';
  52.         }
  53.         $merchantUser $user->getMerchantUser();
  54.         if (!$merchantUser) {
  55.             return null;
  56.         }
  57.         if ($merchantUser->getStatus() !== MerchantUser::STATUS_PASS || $merchantUser->isReview()) {
  58.             return '当前商户账号未审核通过,仅允许查看数据';
  59.         }
  60.         if (!$merchantUser->isEnable()) {
  61.             return '当前商户已被禁用,仅允许查看数据';
  62.         }
  63.         $merchantProxyUser $merchantUser->getProxyUser();
  64.         if ($merchantProxyUser && !$merchantProxyUser->isEnable()) {
  65.             return '当前所属代理已被禁用,仅允许查看数据';
  66.         }
  67.         return null;
  68.     }
  69. }