src/Security/Voter/GaugeVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Gauge\Gauge;
  4. use App\Entity\User;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class GaugeVoter extends Voter
  10. {
  11. // these strings are just invented: you can use anything
  12. const VIEW = 'view';
  13. const EDIT = 'edit';
  14. const DELETE = 'delete';
  15. /**
  16. * @var Security
  17. */
  18. private Security $security;
  19. /**
  20. * @var EntityManagerInterface
  21. */
  22. private EntityManagerInterface $entityManager;
  23. public function __construct(Security $security, EntityManagerInterface $entityManager)
  24. {
  25. $this->security = $security;
  26. $this->entityManager = $entityManager;
  27. }
  28. protected function supports(string $attribute, $subject): bool
  29. {
  30. // if the attribute isn't one we support, return false
  31. if (!in_array($attribute, [self::VIEW, self::EDIT, self::DELETE], true)) {
  32. return false;
  33. }
  34. // only vote on `Gauge` objects
  35. if (!$subject instanceof Gauge) {
  36. return false;
  37. }
  38. return true;
  39. }
  40. protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  41. {
  42. $loggedUser = $token->getUser();
  43. if (!$loggedUser instanceof User) {
  44. // the user must be logged in; if not, deny access
  45. return false;
  46. }
  47. // you know $subject is a Post object, thanks to `supports()`
  48. /** @var Gauge $targetGauge */
  49. $targetGauge = $subject;
  50. switch ($attribute) {
  51. case self::VIEW:
  52. return $this->canSee($targetGauge, $loggedUser);
  53. case self::EDIT:
  54. return $this->canEdit($targetGauge, $loggedUser);
  55. case self::DELETE:
  56. return $this->canDelete($targetGauge, $loggedUser);
  57. }
  58. throw new \LogicException('This code should not be reached!');
  59. }
  60. /**
  61. * @param Gauge $targetGauge
  62. * @param User $loggedUser
  63. * @return bool
  64. */
  65. private function canEdit(Gauge $targetGauge, User $loggedUser): bool
  66. {
  67. if ($this->canSee($targetGauge, $loggedUser) && $this->security->isGranted('ROLE_CAN_EDIT_GAUGE')) {
  68. return true;
  69. }
  70. return false;
  71. }
  72. /**
  73. * @param Gauge $targetGauge
  74. * @param User $loggedUser
  75. * @return bool
  76. */
  77. private function canDelete(Gauge $targetGauge, User $loggedUser): bool
  78. {
  79. if ($this->canSee($targetGauge, $loggedUser) && $this->security->isGranted('ROLE_CAN_DELETE_GAUGE')) {
  80. return true;
  81. }
  82. return false;
  83. }
  84. /**
  85. * @param Gauge $targetGauge
  86. * @param User $loggedUser
  87. * @return bool
  88. */
  89. private function canSee(Gauge $targetGauge, User $loggedUser): bool
  90. {
  91. // if can see gauge building and has permission ROLE_CAN_SEE_GAUGE_DETAIL
  92. if ($this->security->isGranted('view', $targetGauge->getBuilding()) && $this->security->isGranted('ROLE_CAN_SEE_GAUGE_DETAIL')) {
  93. return true;
  94. }
  95. return false;
  96. }
  97. }