vendor/crea/security-bundle/src/Voter/ProfileVoter.php line 16

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Crea\SecurityBundle\Voter;
  4. use Crea\SecurityBundle\Entity\Profile;
  5. use Crea\SecurityBundle\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. /**
  10. * @extends Voter<string, Profile>
  11. */
  12. class ProfileVoter extends Voter
  13. {
  14. public const PROFILE_LIST = 'SECURITY_PROFILE_LIST';
  15. public const PROFILE_CREATE = 'SECURITY_PROFILE_CREATE';
  16. public const PROFILE_UPDATE = 'SECURITY_PROFILE_UPDATE';
  17. public const PROFILE_DUPLICATE = 'SECURITY_PROFILE_DUPLICATE';
  18. public const PROFILE_REMOVE = 'SECURITY_PROFILE_REMOVE';
  19. protected function supports($attribute, $subject): bool
  20. {
  21. return in_array($attribute, [
  22. self::PROFILE_LIST,
  23. self::PROFILE_CREATE,
  24. self::PROFILE_UPDATE,
  25. self::PROFILE_DUPLICATE,
  26. self::PROFILE_REMOVE,
  27. ]) && (null === $subject || $subject instanceof Profile);
  28. }
  29. protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
  30. {
  31. /** @var User $loggedUser */
  32. $loggedUser = $token->getUser();
  33. if (!$loggedUser instanceof UserInterface) {
  34. return false;
  35. }
  36. switch ($attribute) {
  37. case self::PROFILE_LIST:
  38. return $this->voteOnList($loggedUser);
  39. case self::PROFILE_CREATE:
  40. return $this->voteOnCreate($loggedUser);
  41. case self::PROFILE_UPDATE:
  42. return $this->voteOnUpdate($subject, $loggedUser);
  43. case self::PROFILE_DUPLICATE:
  44. return $this->voteOnDuplicate($subject, $loggedUser);
  45. case self::PROFILE_REMOVE:
  46. return $this->voteOnRemove($subject, $loggedUser);
  47. }
  48. return false;
  49. }
  50. private function voteOnList(UserInterface $loggedUser): bool
  51. {
  52. if (in_array(self::PROFILE_LIST, $loggedUser->getRoles())) {
  53. return true;
  54. }
  55. return false;
  56. }
  57. private function voteOnCreate(UserInterface $loggedUser): bool
  58. {
  59. if (in_array(self::PROFILE_CREATE, $loggedUser->getRoles())) {
  60. return true;
  61. }
  62. return false;
  63. }
  64. private function voteOnUpdate(?Profile $subject, User $loggedUser): bool
  65. {
  66. if (!in_array(self::PROFILE_UPDATE, $loggedUser->getRoles())) {
  67. return false;
  68. }
  69. if (null === $subject) {
  70. return true;
  71. }
  72. if ($loggedUser->getProfile()->getId() !== $subject->getId()) {
  73. return true;
  74. }
  75. if (in_array('ROLE_ADMIN', $loggedUser->getRoles())) {
  76. return true;
  77. }
  78. return false;
  79. }
  80. private function voteOnRemove(?Profile $subject, User $loggedUser): bool
  81. {
  82. if (!in_array(self::PROFILE_REMOVE, $loggedUser->getRoles())) {
  83. return false;
  84. }
  85. if (null === $subject) {
  86. return true;
  87. }
  88. if ($loggedUser->getProfile()->getId() !== $subject->getId()) {
  89. return true;
  90. }
  91. if (in_array('ROLE_ADMIN', $loggedUser->getRoles())) {
  92. return true;
  93. }
  94. return false;
  95. }
  96. private function voteOnDuplicate(?Profile $subject, User $loggedUser): bool
  97. {
  98. return $this->voteOnUpdate($subject, $loggedUser);
  99. }
  100. }