<?php
namespace App\Security\Voter\CRM;
use App\Data\RoleConstant;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
/**
* @extends Voter<string, mixed>
*/
class CRMAccessVoter extends Voter
{
public const CRM_ACCESS = 'crm_access';
public const ANONYMOUS_USER = 'anon.';
protected function supports(string $attribute, $subject): bool
{
return self::CRM_ACCESS === $attribute && null !== $subject;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var User|null $user */
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
$userRoles = $user->getRoles();
if (empty($userRoles)) {
return false;
}
switch ($subject) {
case RoleConstant::ROLE_SUPPORT:
return $this->checkRoleInArray([
RoleConstant::ROLE_SUPPORT,
RoleConstant::ROLE_ADMIN_SUPPORT,
RoleConstant::ROLE_ADMIN,
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
case RoleConstant::ROLE_EDUCATEUR:
return $this->checkRoleInArray([
RoleConstant::ROLE_EDUCATEUR,
RoleConstant::ROLE_ADMIN,
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
case RoleConstant::ROLE_ADMIN_SUPPORT:
return $this->checkRoleInArray([
RoleConstant::ROLE_ADMIN_SUPPORT,
RoleConstant::ROLE_ADMIN,
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
case RoleConstant::ROLE_TRADER:
return $this->checkRoleInArray([
RoleConstant::ROLE_TRADER,
RoleConstant::ROLE_ADMIN,
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
case RoleConstant::ROLE_ADMIN:
return $this->checkRoleInArray([
RoleConstant::ROLE_ADMIN,
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
case RoleConstant::ROLE_SUPER_ADMIN:
return $this->checkRoleInArray([
RoleConstant::ROLE_SUPER_ADMIN,
], $userRoles);
}
return false;
}
/**
* @param string[] $rolesToCheck
* @param string[] $userRoles
*/
private function checkRoleInArray(
array $rolesToCheck,
array $userRoles
): bool {
foreach ($rolesToCheck as $roleToCheck) {
if (in_array($roleToCheck, $userRoles, true)) {
return true;
}
}
return false;
}
}