src/Security/Voter/AccountVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace MedBrief\MSR\Security\Voter;
  3. use MedBrief\MSR\Entity\Account;
  4. use MedBrief\MSR\Entity\Firm;
  5. use MedBrief\MSR\Entity\User;
  6. use Override;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\Security\Core\User\UserInterface;
  11. class AccountVoter extends Voter
  12. {
  13. public const CREATE = 'CREATE';
  14. public const READ = 'READ';
  15. public const UPDATE = 'UPDATE';
  16. public const DELETE = 'DELETE';
  17. public const ADMINISTRATION = 'ADMINISTRATION';
  18. public const USER_ADMINISTRATION = 'USER_ADMINISTRATION';
  19. public const SORTING_SETTINGS_ADMINISTRATION = 'SORTING_SETTINGS_ADMINISTRATION';
  20. public const MATTER_REQUEST_DEFAULTS_ADMINISTRATION = 'MATTER_REQUEST_DEFAULTS_ADMINISTRATION';
  21. public const INDEX_HEADER_ADMINISTRATION = 'INDEX_HEADER_ADMINISTRATION';
  22. public const TECHNICAL_ADMINISTRATION = 'TECHNICAL_ADMINISTRATION';
  23. public const UPDATE_PHYSICAL_ADDRESS = 'UPDATE_PHYSICAL_ADDRESS';
  24. public const ADD_OFFICE = 'ADD_OFFICE';
  25. public const ADD_MATTER_REQUEST = 'ADD_MATTER_REQUEST';
  26. public const ADD_LICENCE_RENEWAL_TERM = 'ADD_LICENCE_RENEWAL_TERM';
  27. public const ACCESS_GRANTED = true;
  28. public const ACCESS_DENIED = false;
  29. public function __construct(private readonly AuthorizationCheckerInterface $authorizationChecker)
  30. {
  31. }
  32. #[Override]
  33. protected function supports($attribute, $subject)
  34. {
  35. return in_array($attribute, [
  36. self::CREATE,
  37. self::READ,
  38. self::UPDATE,
  39. self::DELETE,
  40. self::ADMINISTRATION,
  41. self::USER_ADMINISTRATION,
  42. self::SORTING_SETTINGS_ADMINISTRATION,
  43. self::MATTER_REQUEST_DEFAULTS_ADMINISTRATION,
  44. self::INDEX_HEADER_ADMINISTRATION,
  45. self::UPDATE_PHYSICAL_ADDRESS,
  46. self::ADD_OFFICE,
  47. self::TECHNICAL_ADMINISTRATION,
  48. self::ADD_MATTER_REQUEST,
  49. self::ADD_LICENCE_RENEWAL_TERM,
  50. ])
  51. && ($subject instanceof Account || is_subclass_of($subject, Account::class));
  52. }
  53. #[Override]
  54. protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
  55. {
  56. $user = $token->getUser();
  57. // if the user is anonymous, do not grant access
  58. if (!$user instanceof UserInterface) {
  59. return self::ACCESS_DENIED;
  60. }
  61. if ($user instanceof Firm && $user->getClientAreas()->contains($subject)) {
  62. return self::ACCESS_GRANTED;
  63. }
  64. // Super Admin and Admin users can add/edit terms
  65. if ($attribute === self::ADD_LICENCE_RENEWAL_TERM) {
  66. return $this->canCreate();
  67. }
  68. // Super Admin users can do everything
  69. if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
  70. return self::ACCESS_GRANTED;
  71. }
  72. switch ($attribute) {
  73. case self::CREATE:
  74. case self::DELETE:
  75. case self::ADMINISTRATION:
  76. case self::SORTING_SETTINGS_ADMINISTRATION:
  77. case self::MATTER_REQUEST_DEFAULTS_ADMINISTRATION:
  78. // Only Super Admins may create, delete Accounts or have full administration rights
  79. return self::ACCESS_DENIED;
  80. case self::UPDATE:
  81. // If not an internal user, deny updating
  82. return $user->isUserTypeInternal();
  83. }
  84. // If this user is a Client Super Administrator for the Account then they can
  85. // do everything else
  86. if ($this->authorizationChecker->isGranted('ROLE_ACCOUNT_' . $subject->getId() . '_SUPERADMINISTRATOR')) {
  87. return self::ACCESS_GRANTED;
  88. }
  89. // Otherwise if this user is a Client Administrator for the Account then they can
  90. // do everything else except for User Administration and Technical Admin
  91. if ($this->authorizationChecker->isGranted('ROLE_ACCOUNT_' . $subject->getId() . '_ADMINISTRATOR') && !in_array($attribute, [
  92. self::USER_ADMINISTRATION,
  93. self::TECHNICAL_ADMINISTRATION,
  94. ])) {
  95. return self::ACCESS_GRANTED;
  96. }
  97. // A Client technical administrator may perform technical administration as well as other duties
  98. if ($this->authorizationChecker->isGranted('ROLE_ACCOUNT_' . $subject->getId() . '_TECHNICAL_ADMIN') && in_array($attribute, [
  99. self::READ,
  100. self::TECHNICAL_ADMINISTRATION,
  101. self::ADD_MATTER_REQUEST,
  102. ])) {
  103. return self::ACCESS_GRANTED;
  104. }
  105. return self::ACCESS_DENIED;
  106. }
  107. private function canCreate(): bool
  108. {
  109. return $this->authorizationChecker->isGranted('ROLE_ADMIN');
  110. }
  111. }