src/Security/InstructorVoter.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\Service\InstructorService;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. /**
  9.  * Checks if a user instructs any courses and can therefore access instructor controllers.
  10.  */
  11. class InstructorVoter extends Voter
  12. {
  13.     private AdminVoter $adminVoter;
  14.     private InstructorService $instructorService;
  15.     public function __construct(AdminVoter $adminVoterInstructorService $instructorService)
  16.     {
  17.         $this->adminVoter $adminVoter;
  18.         $this->instructorService $instructorService;
  19.     }
  20.     protected function supports(string $attribute$subject): bool
  21.     {
  22.         if ($attribute != 'INSTRUCTOR') {
  23.             return false;
  24.         }
  25.         if ($subject !== null && !$subject instanceof Course) {
  26.             return false;
  27.         }
  28.         return true;
  29.     }
  30.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  31.     {
  32.         $user $token->getUser();
  33.         if (!$user instanceof User) {
  34.             // must be logged in
  35.             return false;
  36.         }
  37.         if ($this->adminVoter->isAdmin($user)) {
  38.             // admin has implicit instructor privileges
  39.             return true;
  40.         }
  41.         if ($subject == null) {
  42.             // no specific course, check if they instruct _any_ course
  43.             return !empty($this->instructorService->fetchInstructorCourses($user));
  44.         }
  45.         return self::canSeeCourse($user$subject);
  46.     }
  47.     public static function canSeeCourse(User $instructorCourse $course): bool
  48.     {
  49.         return !empty(array_intersect($instructor->getRoles(), $course->getInstructorPositions()));
  50.     }
  51. }