src/Security/AdminVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Course;
  4. use App\Entity\User;
  5. use App\Repository\AdminPositionRepository;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. /**
  9.  * Checks if a user has admin access based on their IRMS position(s).
  10.  */
  11. class AdminVoter extends Voter
  12. {
  13.     private AdminPositionRepository $adminPositionRepository;
  14.     public function __construct(AdminPositionRepository $adminPositionRepository)
  15.     {
  16.         $this->adminPositionRepository $adminPositionRepository;
  17.     }
  18.     protected function supports(string $attribute$subject): bool
  19.     {
  20.         if ($attribute != 'ADMIN' && $attribute != 'ADMIN_II') {
  21.             return false;
  22.         }
  23.         if ($subject !== null && !$subject instanceof Course) {
  24.             return false;
  25.         }
  26.         return true;
  27.     }
  28.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  29.     {
  30.         $user $token->getUser();
  31.         if (!$user instanceof User) {
  32.             // must be logged in
  33.             return false;
  34.         }
  35.         if ($attribute == 'ADMIN_II') {
  36.             return self::isIIAdmin($user);
  37.         }
  38.         /** @var ?Course $subject */
  39.         if ($subject === null || !$subject->getImperialIntelligence()) {
  40.             return $this->isAdmin($user);
  41.         }
  42.         return self::canSeeCourse($user$subject);
  43.     }
  44.     public function canSeeCourse(User $userCourse $course): bool
  45.     {
  46.         return $course->getImperialIntelligence() ? self::isIIAdmin($user) : self::isAdmin($user);
  47.     }
  48.     public function isAdmin(User $user): bool
  49.     {
  50.         $adminRoles $this->adminPositionRepository->findAllIds();
  51.         return !empty(array_intersect($user->getRoles(), $adminRoles));
  52.     }
  53.     public function isIIAdmin(User $user): bool
  54.     {
  55.         $iiAdminRoles $this->adminPositionRepository->findAllImperialIntelligenceIds();
  56.         return !empty(array_intersect($user->getRoles(), $iiAdminRoles));
  57.     }
  58. }