<?php
namespace App\Security\Voter;
use App\Entity\RequestLog;
use App\Security\Scope\RequestLogScopeResolver;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
/**
* Decyduje o dostępie do pojedynczego odczytu na podstawie tego, czy jest zweryfikowany.
*
* Tak jak FineVoter: atrybutów można używać w setEntityPermission() i Action::setPermission(),
* a logika ról siedzi w RequestLogScopeResolver.
*/
final class RequestLogVoter extends Voter
{
public const VIEW = 'REQUEST_LOG_VIEW';
public const EDIT = 'REQUEST_LOG_EDIT';
public const VERIFY = 'REQUEST_LOG_VERIFY';
public const ATTRIBUTES = [self::VIEW, self::EDIT, self::VERIFY];
private const VERB_BY_ATTRIBUTE = [
self::VIEW => RequestLogScopeResolver::VERB_VIEW,
self::EDIT => RequestLogScopeResolver::VERB_EDIT,
self::VERIFY => RequestLogScopeResolver::VERB_VERIFY,
];
public function __construct(private readonly RequestLogScopeResolver $scopeResolver)
{
}
protected function supports(string $attribute, $subject): bool
{
return isset(self::VERB_BY_ATTRIBUTE[$attribute]);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$verb = self::VERB_BY_ATTRIBUTE[$attribute];
if ($subject instanceof RequestLog) {
return $this->scopeResolver->can(
$verb,
RequestLogScopeResolver::scopeFor($subject->getIsVerified())
);
}
return $this->scopeResolver->canAnywhere($verb);
}
}