<?php
namespace App\Security\Voter;
use App\Entity\Role;
use App\Entity\User;
use App\Enum\PermissionEnum;
use App\Service\UserPermissionLookup;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class PermissionVoter extends Voter
{
/**
* @var UserPermissionLookup
*/
private $userPermissionLookup;
public function __construct(UserPermissionLookup $userPermissionLookup)
{
$this->userPermissionLookup = $userPermissionLookup;
}
protected function supports($attribute, $subject)
{
$permissions = [
PermissionEnum::ROLE_CREATE,
PermissionEnum::ROLE_EDIT,
PermissionEnum::ROLE_DELETE,
PermissionEnum::ROLE_VIEW,
];
if (!\in_array($attribute, $permissions, true)) {
return false;
}
if (!$subject instanceof Role) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
switch ($attribute) {
case PermissionEnum::ROLE_EDIT:
return $this->canEdit($subject, $user);
break;
case PermissionEnum::ROLE_VIEW:
return $this->canView($subject, $user);
break;
case PermissionEnum::ROLE_CREATE:
return $this->canCreate($subject, $user);
break;
case PermissionEnum::ROLE_DELETE:
return $this->canDelete($subject, $user);
break;
}
return false;
}
private function canView(Role $role, User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::ROLE_VIEW, $permissions, true)) {
return true;
}
return false;
}
private function canEdit(Role $role, User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::ROLE_EDIT, $permissions, true)) {
return true;
}
return false;
}
private function canCreate(Role $role, User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::ROLE_CREATE, $permissions, true)) {
return true;
}
return false;
}
private function canDelete(Role $role, User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::ROLE_DELETE, $permissions, true)) {
return true;
}
return false;
}
}