. */ namespace Chill\DocStoreBundle\Security\Authorization; use App\Security\Authorization\VoterHelperFactory; use Chill\MainBundle\Security\Authorization\AbstractChillVoter; use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Chill\MainBundle\Security\Authorization\VoterHelperFactoryInterface; use Chill\MainBundle\Security\Authorization\VoterHelperInterface; use Chill\MainBundle\Security\ProvideRoleHierarchyInterface; use Chill\DocStoreBundle\Entity\PersonDocument; use Chill\MainBundle\Security\Resolver\CenterResolverDispatcher; use Chill\PersonBundle\Entity\Person; use Chill\MainBundle\Entity\User; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Role\Role; use Psr\Log\LoggerInterface; use Symfony\Component\Security\Core\Security; /** * */ class PersonDocumentVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface { const CREATE = 'CHILL_PERSON_DOCUMENT_CREATE'; const SEE = 'CHILL_PERSON_DOCUMENT_SEE'; const SEE_DETAILS = 'CHILL_PERSON_DOCUMENT_SEE_DETAILS'; const UPDATE = 'CHILL_PERSON_DOCUMENT_UPDATE'; const DELETE = 'CHILL_PERSON_DOCUMENT_DELETE'; protected LoggerInterface $logger; protected Security $security; protected VoterHelperInterface $voterHelper; public function __construct( LoggerInterface $logger, Security $security, VoterHelperFactoryInterface $voterHelperFactory ) { $this->logger = $logger; $this->security = $security; $this->voterHelper = $voterHelperFactory ->generate(self::class) ->addCheckFor(PersonDocument::class, $this->getRoles()) ->addCheckFor(Person::class, [self::SEE, self::CREATE]) ->build(); } public function getRoles() { return [ self::CREATE, self::SEE, self::SEE_DETAILS, self::UPDATE, self::DELETE ]; } protected function supports($attribute, $subject) { return $this->voterHelper->supports($attribute, $subject); } /** * * @param string $attribute * @param PersonDocument $subject * @param TokenInterface $token * @return boolean */ protected function voteOnAttribute($attribute, $subject, TokenInterface $token) { $this->logger->debug(sprintf("Voting from %s class", self::class)); if (!$token->getUser() instanceof User) { return false; } if ($subject instanceof PersonDocument && !$this->security->isGranted(PersonVoter::SEE, $subject->getPerson())) { return false; } return $this->voterHelper->voteOnAttribute($attribute, $subject, $token); } public function getRolesWithoutScope() { return array(); } public function getRolesWithHierarchy() { return ['PersonDocument' => $this->getRoles() ]; } }