Bonjour,

Je suis en train de créer une application pour 3 écoles de mon village.

Ce que je veux

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.

Ce que je fais

Côté entités, je dispose :

  • D'une entité User
  • D'une entité School

Côté relation entre les entités :

  • Dans School j'ai une relation avec l'entité Director en OneToMany
  • Entre User et School j'ai une relation de type ManyToMany dont une table User_School est automatiquement générée

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;
    }
}

Ce que je cherche à faire

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

Aucune réponse