src/Security/Voters/AccountListVoter.php line 16

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voters;
  4. use App\Entity\Client;
  5. use App\Entity\OA2User;
  6. use App\Repository\ClientRepository;
  7. use App\Repository\Permissions\AccountPermissionSettingRepository;
  8. use App\Repository\Permissions\ClientAccountPermissionRepository;
  9. use App\Security\Dto\AccountListDto;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  12. class AccountListVoter extends Voter
  13. {
  14.     public const MODE_UPDATE 'update';
  15.     public const MODE_READ 'read';
  16.     private $accPermSettingRepository;
  17.     private $clientAccPermRepository;
  18.     private $clientRepository;
  19.     public function __construct(
  20.         AccountPermissionSettingRepository $accPermSettingRepository,
  21.         ClientAccountPermissionRepository $clientAccPermRepository,
  22.         ClientRepository $clientRepository
  23.     ) {
  24.         $this->accPermSettingRepository $accPermSettingRepository;
  25.         $this->clientAccPermRepository $clientAccPermRepository;
  26.         $this->clientRepository $clientRepository;
  27.     }
  28.     /**
  29.      * @param string $attribute
  30.      * @param mixed  $subject
  31.      *
  32.      * @return bool
  33.      */
  34.     protected function supports($attribute$subject)
  35.     {
  36.         if (!in_array($attribute$this->getSupportedPermissions())) {
  37.             return false;
  38.         }
  39.         return !(!$subject instanceof AccountListDto)
  40.          ;
  41.     }
  42.     /**
  43.      * @param string $attribute
  44.      * @param mixed  $subject
  45.      *
  46.      * @return bool
  47.      */
  48.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  49.     {
  50.         /** @var AccountListDto $accountListDto */
  51.         $accountListDto $subject;
  52.         $currentClient $this->getCurrentClient($token);
  53.         if (!$currentClient) {
  54.             return false;
  55.         }
  56.         /** @var int[] $verificationAccountIds */
  57.         $verificationAccountIds $accountListDto->getAccountIds();
  58.         $permissionId $this->accPermSettingRepository->getIdByHardvalue(AccountVoter::PERMISSION_VIEW_ACCOUNT);
  59.         return $this->clientAccPermRepository->verifyAccountsByPermission($verificationAccountIds$currentClient$permissionId);
  60.     }
  61.     private function getSupportedPermissions(): array
  62.     {
  63.         return [
  64.             AccountVoter::MODE_UPDATE,
  65.             AccountVoter::MODE_READ,
  66.         ];
  67.     }
  68.     private function getCurrentClient(TokenInterface $token): ?Client
  69.     {
  70.         /** @var OA2User $oa2User */
  71.         $oa2User $token->getUser();
  72.         if (!$oa2User instanceof OA2User || $oa2User->isBankUser()) {
  73.             return null// Client user only
  74.         }
  75.         return $this->clientRepository->findOneByOa2User($oa2User);
  76.     }
  77. }