<?php
/**
* This file is part of Synapse.
*
* Copyright (C) 2020-2022 Daniel Ménard
*
* For copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace App\Security;
use App\Entity\Company;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
/**
* CompanyReviewVoter.
*
* @author Daniel Ménard <daniel.menard.35@gmail.com>
*/
final class CompanyReviewVoter extends Voter
{
/**
* L'attribut à utiliser pour déterminer si l'utilisateur a accès à l'annuaire du DDO.
*/
public const DDO_REVIEWS = 'ddo_reviews';
/**
* L'attribut à utiliser pour déterminer si l'utilisateur a accès à l'annuaire du groupe.
*/
public const GROUP_REVIEWS = 'group_reviews';
/**
* L'attribut à utiliser pour déterminer si l'utilisateur a accès à l'annuaire global Synapse.
*/
public const GLOBAL_REVIEWS = 'global_reviews';
/**
* Le rôle à attribuer à un utilisateur pour lui donner le droit GLOBAL_REVIEWS.
*/
public const ROLE_GLOBAL_REVIEWS = 'ROLE_GLOBAL_REVIEWS';
/**
* Liste des attributs que l'on gère.
*/
private const ATTRIBUTES = [
self::DDO_REVIEWS => 'canAccessDdoReviews',
self::GROUP_REVIEWS => 'canAccessGroupReviews',
self::GLOBAL_REVIEWS => 'canAccessGlobalReviews',
];
/**
* {@inheritdoc}
*/
final protected function supports(string $attribute, $subject): bool
{
return isset(self::ATTRIBUTES[$attribute]);
}
/**
* {@inheritdoc}
*/
final protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
// L'utilisateur doit être connecté, seuls les user Company ont un annuaire (pas les accès AO)
$user = $token->getUser();
if (!$user instanceof Company) {
return false;
}
// Teste la permission demandée
$method = [$this, self::ATTRIBUTES[$attribute]];
return $method($user);
}
/**
* Teste si un utilisateur a accès à l'annuaire du DDO.
*/
final protected function canAccessDdoReviews(Company $user): bool
{
// Seulement si c'est un DDO et que ce n'est pas un groupe
return $user->getIsDDO() && ($user->getGroupId() !== $user->getId());
}
/**
* Teste si un utilisateur a accès à l'annuaire du groupe.
*/
final protected function canAccessGroupReviews(Company $user): bool
{
// Seulement si c'est un un groupe ou un DDO rattaché à un groupe
return 0 !== $user->getGroupId();
}
/**
* Teste si un utilisateur a accès à l'annuaire global Synapse.
*/
final protected function canAccessGlobalReviews(Company $user): bool
{
// Si le rôle 'ROLE_GLOBAL_REVIEWS' a explicitement été attribué ou si c'est un admin
$roles = (array) $user->getRoles();
return in_array(self::ROLE_GLOBAL_REVIEWS, $roles) || in_array('ROLE_ADMIN', $roles);
}
}