src/Security/Voter/ProjectClosureVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace MedBrief\MSR\Security\Voter;
  3. use MedBrief\MSR\Entity\ProjectClosure;
  4. use MedBrief\MSR\Entity\User;
  5. use Override;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. use Symfony\Component\Security\Core\User\UserInterface;
  10. class ProjectClosureVoter extends Voter
  11. {
  12. public const READ = 'READ';
  13. public function __construct(private readonly AuthorizationCheckerInterface $authorizationChecker)
  14. {
  15. }
  16. #[Override]
  17. protected function supports($attribute, $subject)
  18. {
  19. return $attribute == self::READ
  20. && ($subject instanceof ProjectClosure || is_subclass_of($subject, ProjectClosure::class));
  21. }
  22. /**
  23. * Checks if a user can read a ProjectClosure.
  24. *
  25. * @param ProjectClosure $projectClosure
  26. * @param User $user
  27. */
  28. protected function canRead(ProjectClosure $projectClosure, User $user): bool
  29. {
  30. if ($projectClosure->getProject() && true === $user->isAccountAdministratorForAccount($projectClosure->getProject()->getAccount())) {
  31. return self::ACCESS_GRANTED;
  32. }
  33. return self::ACCESS_DENIED;
  34. }
  35. #[Override]
  36. protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
  37. {
  38. // get current logged in user
  39. /** @var User $user */
  40. $user = $token->getUser();
  41. /** @var ProjectClosure $projectClosure */
  42. $projectClosure = $subject;
  43. // if the user is anonymous, do not grant access
  44. if (!$user instanceof UserInterface) {
  45. return self::ACCESS_DENIED;
  46. }
  47. // SuperAdmin and Administrator for Medbrief users can do everything
  48. if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
  49. return self::ACCESS_GRANTED;
  50. }
  51. if ($attribute === self::READ) {
  52. return $this->canRead($projectClosure, $user);
  53. }
  54. return self::ACCESS_DENIED;
  55. }
  56. }