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 :

FoSUser combiné à FoSRest, prob. edition profile


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut FoSUser combiné à FoSRest, prob. edition profile
    Bonjour,

    Je suis en train de développer des web services pouvant gérer les utilisateurs, j'ai donc d'installé FosUserBundle pour gérer les utilisateurs et FosRestBundle pour gérer mes web services.

    Pour le moment j'ai copié/collé ce qu'il y a dans le contrôleur de FosUserBundle :

    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
    public function postUpdateAction(Request $request, $userId)
        {
     
            $user = $this->container->get('security.context')->getToken()->getUser();
     
            if (!is_object($user)) {
                throw new AccessDeniedException('This user does not have access to this section.');
            }
     
            $form = $this->container->get('fos_user.profile.form');
            $formHandler = $this->container->get('fos_user.profile.form.handler');
     
            $process = $formHandler->process($user);
            if ($process) {
                $this->setFlash('fos_user_success', 'profile.flash.updated');
     
                return new RedirectResponse($this->getRedirectionUrl($user));
            }
     
            return $this->container->get('templating')->renderResponse(
                'FOSUserBundle:Profile:edit.html.'.$this->container->getParameter('fos_user.template.engine'),
                array('form' => $form->createView())
            );
        }
    Lorsque je fais une requête POST avec comme paramètre :

    fos_user_profile_form[email] = toto@toto.com

    Il m'affiche le formulaire avec comme erreur "Le jeton CSRF est invalide. Veuillez renvoyer le formulaire." ce qui est normal vu que je n'ai pas affiché le formulaire à la base et que j'ai directement donné les valeurs en POST.

    Ce que j'aimerais savoir :

    - Comment désactiver la protection CSRF uniquement à ce moment là ? (Tout en le gardant pour le formulaire présent sur le site)

    - Est-il possible de changer le "name" du formulaire, c'est-à-dire ne pas avoir besoin de donner "fos_user_profile_form[email]" mais juste"email" dans la variable POST, est-ce possible ou je dois tout gérer moi même ?

    Merci d'avance =)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Up, personne n'a une idée ? Au moins sur une des deux questions ? ^^

    - Comment désactiver la protection CSRF uniquement à ce moment là ? (Tout en le gardant pour le formulaire présent sur le site)

    - Est-il possible de changer le "name" du formulaire, c'est-à-dire ne pas avoir besoin de donner "fos_user_profile_form[email]" mais juste"email" dans la variable POST, est-ce possible ou je dois tout gérer moi même ?

  3. #3
    Membre habitué
    Ingénieur d'études et de développement
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur d'études et de développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Points : 154
    Points
    154
    Par défaut
    Voici ce que je lis dans la doc du bundle

    CSRF validation

    When building a single application that should handle forms both via HTML forms as well as via a REST API, one runs into a problem with CSRF token validation. In most cases it is necessary to enable them for HTML forms, but it makes no sense to use them for a REST API. For this reason there is a form extension to disable CSRF validation for users with a specific role. This of course requires that REST API users authenticate themselves and get a special role assigned.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fos_rest:
        disable_csrf_role: ROLE_API

    Désactiver le csrf token, est un principe de base, car les api REST sont stateless.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Salut Damiensan et merci pour ton aide, je n'étais pas tombé là dessus ^^

    j'ai rajouté la ligne dans le config.php et mis à jour la fonction de mon Web Service de cette façon :

    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
    public function postUpdateAction(Request $request)
        {
            $user = $this->getUser();
            $user->addRole("ROLE_API");
     
     
            $form = $this->container->get('fos_user.profile.form');
            $formHandler = $this->container->get('fos_user.profile.form.handler');
     
            $process = $formHandler->process($user);
            if ($process) {
                $this->setFlash('fos_user_success', 'profile.flash.updated');
     
                return new RedirectResponse($this->getRedirectionUrl($user));
            }
     
            return $this->container->get('templating')->renderResponse(
                'FOSUserBundle:Profile:edit.html.'.$this->container->getParameter('fos_user.template.engine'),
                array('form' => $form->createView())
            );
        }
    En fait je rajoute le rôle après avoir récupéré l'utilisateur car je ne pense pas pouvoir le faire à l'authentification c'ets un collègue qui s'est occupé de l'authentification et il l'a faite avec FoSOAuthServerBundle.

    Le problème c'est qu'il ne passe toujours pas le process et qu'il me met toujours l'erreur sur le jeton CSRF.

    Du coup je me suis dit que la vérification du rôle était faite directement en BDD et pas sur l'user actuellement connecté donc j'ai rajouté en BdD le rôle (j'ai vérifié il y est bien rajouté) :
    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
    public function postUpdateAction(Request $request)
        {
            $user = $this->getUser();
            $user->addRole("ROLE_API");
            $em = $this->container->get('doctrine')->getManager();
            $em->flush();
     
            $form = $this->container->get('fos_user.profile.form');
            $formHandler = $this->container->get('fos_user.profile.form.handler');
     
            $process = $formHandler->process($user);
            if ($process) {
                $this->setFlash('fos_user_success', 'profile.flash.updated');
     
                return new RedirectResponse($this->getRedirectionUrl($user));
            }
     
            return $this->container->get('templating')->renderResponse(
                'FOSUserBundle:Profile:edit.html.'.$this->container->getParameter('fos_user.template.engine'),
                array('form' => $form->createView())
            );
        }
    Le problème c’est qu'à priori il ne passe toujours pas le process vu qu'il m'affiche toujours le formulaire, mais cette fois il ne m'affiche pas du tout d'erreur (donc l'erreur sur le jeton CSRF a disparu)

    Edit:
    De plus je doute que je fasse bien les choses vu que là il l'enlève aussi dans le formulaire html du site web...vu qu'il détecte qu'il a le rôle ROLE_API

Discussions similaires

  1. [2.x] [FOSUserBundle] Edition du profil avec un champ 'disabled'
    Par Tony2807 dans le forum Symfony
    Réponses: 4
    Dernier message: 22/06/2012, 15h34
  2. Réponses: 7
    Dernier message: 30/09/2010, 16h30
  3. [WD-2007] Prob edition s/Word de tableaux Excel
    Par Daniel82 dans le forum Word
    Réponses: 6
    Dernier message: 13/05/2010, 19h36
  4. Editer (modifier) un profil
    Par dalidali86 dans le forum JSF
    Réponses: 6
    Dernier message: 07/09/2009, 01h16
  5. [JSP] prob pour combiner STRUTS et TILES (web.xml)
    Par lipao17 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/04/2005, 10h57

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