Bonjour,
Je suis en train de créer une application pour 3 écoles de mon village.
Chaque directeur se connecte de manière indépendante, mais je ne souhaite pas que le directeur de l'école A, puisse visualiser et modifier un utilisateur d'une école B (en changeant le paramètre ID passé dans l'URL par exemple).
J'ai cru comprendre que la mise en place d'un "voter" serait la solution à ce problème.
Côté entités, je dispose :
Côté relation entre les entités :
J'ai donc créé un voter :
php bin/console make:voter
Et me retrouve avec ce fichier :
<?php
namespace App\Security\Voter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class DirectorEditUserVoter extends Voter
{
protected function supports($attribute, $subject)
{
// replace with your own logic
// https://symfony.com/doc/current/security/voters.html
return in_array($attribute, ['EDIT', 'VIEW'])
&& $subject instanceof \App\Entity\School;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
// ... (check conditions and return true to grant permission) ...
switch ($attribute) {
case 'EDIT':
// logic to determine if the user can EDIT
// return true or false
break;
case 'VIEW':
// logic to determine if the user can VIEW
// return true or false
break;
}
return false;
}
}
Pourriez-vous me dire comment mettre en place ma condition dans mes "case" (EDIT et VIEW) pour faire en sorte que je puisse modifier et éditer uniquement des utilisateurs qui sont dans la même école que la mienne ?
Un grand merci par avance !
Grub