IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Problèmes suppression avec CSRF Token et Ajax


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 106
    Points : 271
    Points
    271
    Par défaut Problèmes suppression avec CSRF Token et Ajax
    Bonjour à tous,

    Je souhaite utiliser la protection csrf dans un appel ajax au click sur une image pour la supprimer, pour cela j'ai suivi un tuto en ligne, malheureusement la méthode 'DELETE' n'est pas acceptée et le $request->request->getContent() ou bien $request->request->getString('_token') retournent un null, que j' inclue la galerie d'image dans le form ou à l'extérieur...
    Quelle serait la bonne méthode selon vous avec Symfony 7.1 et Ajax ?

    Merci d'avance

    GaleriesController.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #[Route('supprimer-image/{id}', 'supprimer_image',methods:['GET','DELETE'])]
        public function supprimerImage(Images $image, Request $request, EntityManagerInterface $em): Response
        {
            $request->enableHttpMethodParameterOverride();
            dd($request->request->getString('_token'));
            $data = json_decode($request->getContent(), true);
            if ($this->isCsrfTokenValid('delete' . $image->getId(), $data['_token'])) {
                $nom = $image->getName();
                unlink($this->getParameter('images_directory') . '/' . $nom);
                $em->remove($image);
                $em->flush();
     
                return new JsonResponse(['success' => 1]);
            } else {
                return new JsonResponse(['error' => 'Token invalide'], 400);
            }
        }
    _galerie.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {% for image in images %}
    	<div class="miniature">
     
    		<a class="btn-suppression-image" 
    		href="{{path('galeries_supprimer_image',{'id':image.id})}}" 
    		data-delete data-token="{{csrf_token('delete' ~ image.id)}}">&times;</a>
    		<img src="{{asset('/uploads/images/mini/300x300-' ~ image.name)}}" alt="{{image.name}}" width="150">
    images.js

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    window.onload = () => {
      //Supprimer une image
      const btnSuppression = document.querySelectorAll(["data-delete"]);
     
      for (btn of btnSuppression) {
        btn.addEventListener("click", (e) => {
          console.log("click sur suppression");
          e.preventDefault();
          if (confirm("Etes-vous sûr(e) de vouloir supprimer cette image ?")) {
            fetch(btn.getAttribute("href"), {
              method: "DELETE",
              headers: {
                "X-Requested-With": "XMLHttpRequest",
                "Content-Type": "application/json",
              },
              body: JSON.stringify({ _token: btn.dataset.token }),
            })
              .then((response) => response.json())
              .then((data) => {
                if (data.success) {
                  btn.parentElement.remove();
                } else {
                  alert(data.error);
                }
              })
              .catch((e) => alert(e));
          }
        });
      }
    };

  2. #2
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 351
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Tu es sûr que ta requête ajax est bien envoyée (à vérifier via l'onglet Réseau dans les outils de dév de ton navigateur) ?
    Est-ce que tu vois tes traces de log "click sur suppression" dans la console du navigateur ?

    Actuellement, ton code ne semble pas fonctionnel car le sélecteur css pour btnSuppression n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const btnSuppression = document.querySelectorAll(["data-delete"]);
    // correction : 
    const btnSuppression = document.querySelectorAll("[data-delete]");

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 106
    Points : 271
    Points
    271
    Par défaut
    Merci beaucoup Pytet pour cette correction, cependant, j'ai toujours la même erreur à savoir : la variable $request reste null ...

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/12/2017, 14h52
  2. [2.x] formulaire AJAX et CSRF Token
    Par dukoid dans le forum Symfony
    Réponses: 3
    Dernier message: 08/01/2015, 09h57
  3. [AJAX] suppression avec demande
    Par mdh12 dans le forum AJAX
    Réponses: 4
    Dernier message: 17/05/2010, 01h41
  4. Requete de suppression avec en condition une date
    Par PrinceMaster77 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/04/2004, 09h23
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo