<?php
namespace App\Security\Voter;
use App\Entity\App\File;
use App\Entity\User\User;
use App\Service\FileAccessService;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class FileVoter extends Voter
{
private const FILE_ACCESS = 'FILE_ACCESS';
/**
* @var FileAccessService
*/
private $fileAccessService;
public function __construct(FileAccessService $fileAccessService)
{
$this->fileAccessService = $fileAccessService;
}
protected function supports($attribute, $subject): bool
{
return in_array($attribute, [self::FILE_ACCESS])
&& $subject instanceof File;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
/** @var User $user */
$user = $token->getUser();
if (! $user instanceof UserInterface) {
return false;
}
// ... (check conditions and return true to grant permission) ...
switch ($attribute) {
case self::FILE_ACCESS:
return $this->fileAccessService->userCanAccessFile($user, $subject);
}
return false;
}
}