Hello !

Connecté en tant qu'Admin et dans un espace admin,

je souhaiterais attribuer le rôle administrateur à un User.

J'ai donc un bouton sur lequel je click, si le User est admin sa lui enlève l'Admin si il ne l'es pas il le devient !

    /**
     * @Route("/admin/user/grade/{id}", name="grade_admin")
     */
     public function grade_admin(User $user, EntityManagerInterface $em)
     {

        if($user->getRoles(['ROLE_ADMIN'])){
            $user->setRoles([]);
            $em->flush();
        } elseif{
            $user->setRoles(["ROLE_ADMIN"]);
            $em->flush();
        }

        $this->addFlash('success', "La modification a bien été pris en compte");
        return $this->redirectToRoute('admin_users');
     }

Mais il se trouve que je peux enlever le role Admin sans soucis, mais pas l'attribuer.
Je pense que Symfony me bloque par sécurité.

J'avais déjà eu le cas avec le changement de mot de passe, mais en passant par un form je n'avais plus eu de problème.
Auriez-vous une idée ou une solution ?

Merci beaucoup !
S2LF

5 réponses


S2LF
Auteur
Réponse acceptée

Bonjour.
Merci pour votre réponse

J'ai un peu du mal avec la doc Symfony parfois, à la retranscrire et à m'en servir dans mes projets. :(

Après réfléxion je vais mettre de côté cette fonctionnalité, en effet la possibilité de donner le rôle admin à un User peut-être une faille et il vaut mieux avoir 2 User dédié en amont à cette tâche, mis en place avec des fixtures par exemple.

Mais votre aide me sera utile, j'en ai pas encore finit avec les csrf_token ;)

Je clos donc le sujet.

Bonjour,

Je pense que le probleme vient de la persistence des modifications, essayer ceci

$user->setRoles(["ROLE_ADMIN"]);
$em->persist($user);
$em->flush();

Salut,

Il y a une erreur dans ton code :

if($user->getRoles(['ROLE_ADMIN'])){
            $user->setRoles([]);
            $em->flush();
        } elseif{
            $user->setRoles(["ROLE_ADMIN"]);
            $em->flush();
        }

else if se contruit comment le if (en gros tu lui passe une deuxième condition)

Et je pense que dans ton cas, tu pourrai juste faire un if et vérifier si l'utilisateur à le role et puis un else dans le cas contraire si il ne le possède pas

S2LF
Auteur

Hello

Merci pour vos réponses.

@Mael-91
En effet il y a une erreur j'avais modifié mon code pour l'illustrer et j'ai laissé le "if" au elseif;

@condor24
J'avais déjà fait ces essais je l'ai refait à l'instant pour être sûre, $em->persist($users) ne change pas.

Comme dis j'ai déjà eu ce comportement ( la page se rafraîchis juste) lorsque je voulais faire un changement de mot de passe pour un User.
Le pb se situais au niveau de la sécurité. Il fallait un csrf_token.
Pour le changement de mot de passe, je suis finalement passé par un form_type qui inclus un csrf_token.

Est-ce qu'éventuellement vous sauriez comment je peux faire pour générer un csrf_token qui serais vérifié par le Controller ?

Selon le doc de symfony :


// ...
use App\Entity\Task;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TaskType extends AbstractType
{
    // ...

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class'      => Task::class,
            // enable/disable CSRF protection for this form
            'csrf_protection' => true,
            // the name of the hidden HTML field that stores the token
            'csrf_field_name' => '_token',
            // an arbitrary string used to generate the value of the token
            // using a different string for each form improves its security
            'csrf_token_id'   => 'task_item',
        ]);
    }

    // ...
}