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 :

Asserts private Roles


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut Asserts private Roles
    Bonjour,

    j'aimerai comprendre le fonctionnement de roles dans la gestion des utilisateurs dans symfony 4

    J'ai implémenté une class Player avec UserInterface. Si j'ai bien compris cela m'impose d'importer 5 fonctions obligatoires.

    Je bloque sur la gestion du Json

    voici mon code


    Entity Player
    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
     
    ...
    class Player implements UserInterface
    {
     const ROLESALLOWED = ['ROLE_PLAYER', 'ROLE_POLISTE'];
     
    ..
    /**
    * @var array
    *
    * @ORM\Column(type="json")
    * @Assert\Choice(choices=Player::ROLESALLOWED, message="ROLE INVALIDE.")
    * 
    */
    private $roles = [];
    ...
    public function getRoles()
    {
     $roles = $this->roles;
     
     // Afin d'être sûr qu'un user a toujours au moins 1 rôle
     if (empty($roles)) {
      $roles[] = 'ROLE_PLAYER';
     }
     return array_unique($roles);
    }
     
    public function setRoles(array $roles): void
     {
      $this->roles = $roles;
     }
    PlayerController
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    $player->setPassword($passwordCrypt)
     ->setConfirmedAt($today)
     ->setRoles(['ROLE_PLAYER']);
    ...
    J'ai un retour comme quoi le ROLE_PLAYER est invalide. Message = ROLE INVALIDE

    La structure de ma table pour la colonne "roles" :
    type : longtext
    interclassement : UTF8mb4_general_ci
    null : non
    commentaires : DC2Type:json
    ...

    Est-ce vraiment du Json ? quel est le bon format ?

    J'ai également des problèmes dans mes requêts SQL sur cette colonne ?

    Avez-vous des conseils ?

    merci pour votre retour

  2. #2
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Bonjour,

    En fait, MySQL stocke une chaîne de caractères. C'est Doctrine qui vérifie à l'insertion et à la lecture que la chaîne de caractères est un champ de type json à la syntaxe valide. Si c'est le cas, Doctrine désérialise la chaîne de caractère et te retourne un tableau. Dans le cas, d'un autre moteur de base de données plus abouti (PostgreSql, Microsoft SQL Server), là, c'est directement stocké comme un json.

    J'imagine que l'utilisateur ne peut pas choisir son rôle à son inscription. Donc je suppose que dans le formulaire d'inscription tu n'as pas mis de champ "roles" avec des cases à cocher. Par conséquent ce formulaire sera toujours invalide, d'où cette erreur. C'est à la main que tu ajoutes le rôle (la fameuse ligne "->setRoles(['ROLE_PLAYER']);" ). Et cette ligne est sans doute après le test de validation du formulaire. D'où l'erreur ! Tu peux nous passer le code complet de l'action d'inscription de ton contrôleur pour qu'on vérifie, mais je suis quasiment sûr que c'est cela.

    Ce genre d'assertion ne sert que pour les formulaires des administrateurs quand tu veux vérifier que les administrateurs cochent les bonnes cases. Dans ce cas, pour que l'assertion ne soit vérifiée que dans le formulaire d'administration et pas dans le formulaire d'inscription, tu dois ajouter un "Group" à l'assertion, mais sinon, tu n'en as pas besoin, car ce n'est pas un champ que l'utilisateur malveillant peut modifier en hackant le formulaire.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Bonjour,

    Merci pour votre retour. Voici mon controller

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     public function playerRegister(FunctionsRandom $functionsRandom, Request $request, EntityManagerInterface $manager, UserPasswordEncoderInterface $encoder)
    {
     $player = new Player();
     $form = $this->createForm(PlayerType::class, $player);
    
     $form->handleRequest($request);
    
     if ($form->isSubmitted() && $form->isValid()) {
    
     $user = $this->getUser();
     $userId = $user->getId();
    
    ....
     $zoneId               = $form->get('departement')->getData()->getIdZone();
     $password             = $functionsRandom->generateChainRandom(9);
     $passwordCrypt        = $encoder->encodePassword($user, $password);
     $today                = new DateTime('now');
    
    
    
    $player->setZoneLicence($zoneId)
     ->setUser($user)
     ->setCategorie($categorie)
     ->setNbreMois($intervalMoisTotal)
     ->setPassword($passwordCrypt)
     ->setConfirmedAt($today)
     ->setRoles(["ROLE_PLAYER"]);  // J'insère manuellement cette valeur 
    
     $manager->persist($player);
     $manager->flush();
    
     $this->addFlash("success", "Félicitations, votre enregistrement.... !");
    
      return $this->redirectToRoute('playRegister');
     }
    
     return $this->render('par/playRegister.html.twig', [
      'form' => $form->createView()
     ]);
    }

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    C'est bien ce que je pensais, le formulaire est invalide, car le rôle n'est pas spécifié (dans le formulaire). Tu l'ajoutes par la suite.
    Tu peux commencer par ajouter cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $player->setRoles(['ROLE_PLAYER']);
    avant cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(PlayerType::class, $player);
    La meilleure pratique serait de modifier ton formulaire pour qu'il ne dépende plus de l'entité Player, mais d'un modèle.
    La ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'data_class' => Player::class ,
    doit être remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'data_class' => PlayerModel::class,
    Ensuite, tu crées une classe PlayerModel comme décrit dans ce tutoriel :
    https://symfonycasts.com/screencast/...forms/form-dto

    Une solution à très court terme serait de supprimer cette assertion sur ton rôle, puisque tu le remplis toi-même dans le contrôleur manuellement.

    Une variante à très court terme Si tu as besoin de cet assertion pour l'administration des Player, je te recommande d'ajouter un groupe pour qu'il ne soit plus utiliser lors de l'inscription, mais uniquement dans l'administration.
    https://symfony.com/doc/current/form...on_groups.html
    https://symfony.com/doc/current/validation/groups.html

    Une information très importante aussi : Tout utilisateur connecté et inscrit reçoit automatiquement le ROLE_USER. Donc à mon avis, tu devrais pouvoir te passer de ce ROLE_PLAYER.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Merci pour vos explications très précieuses car elles me permettent d'un peu mieux comprendre.

    Je vais essayer de mettre en oeuvre la Form Model Class car j'ai beaucoup de formulaire qui reprennent que partiellement mes entités voir pas du tout

    Dans le même esprit, j'aimerai utiliser google charts gauge comme base d'un formulaire. L'idée est de récupérer les valeurs de 5 gauges pour les envoyer à mon controller

    https://developers.google.com/chart/.../gallery/gauge

    Le problème est que c'est du javascript. Quelle est la bonne pratique ?

    1 .Ajax et je dois être réorienter vers une nouvelle page.

    2. créer un formulaire dans lequel j'insère les valeurs javascript récupérées sur un addeventListenner

    .....

    Puis j'aurai le pb de la validation (faut-il que je valide les datas avec une fonction dans mon controller ou service ?)

    Je vous présente un bout de code pour illustrer ma demande ?

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ....
            <div class="gauge_graph">
                <div id="gauge_fatigue" class="gauge_div"></div>
                <div class="gauge_div_btn">
                    <button type="button"  onclick="changeTempFatigue(-1)" class="btn btn-light gauge_btn"/>-</button>
                    <button type="button"  onclick="changeTempFatigue(1)" class="btn btn-light gauge_btn ml-3" />+</button> 
     
                </div>
            </div>
    ....
     
        <div id=""class="form-group text-center mt-2 mb-4">
            <input type="submit" value="Enregistrer" class="btn login_btn" id="btnSubmit"> 
        </div>


    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
    32
    33
        var btnSubmit = document.getElementById('btnSubmit');
        //console.log(btnSubmit);
     
        btnSubmit.addEventListener('click', function() {
            //console.log('bloqué'); 
     
            var texts = document.getElementsByTagName('text');
     
            var fatigue         = texts[3].innerHTML;
            var sommeil         = texts[7].innerHTML;
            var douleur         = texts[11].innerHTML;
            var stress          = texts[15].innerHTML;
            var alimentation    = texts[19].innerHTML;
     
            var formData = new FormData();
     
            formData.append("fatigue", fatigue);
            formData.append("sommeil", sommeil);
            formData.append("douleur", douleur);
            formData.append("stress", stress);
            formData.append("alimentation", alimentation);    
     
            var urlAjax = "{{ path('TraitAjaxReleveSante') }}"; 
                fetch(urlAjax, {
                    method: 'POST',
                    body: formData
                })
                .then(function (response) {
                    return response.json();
                })
                .then(function(objetResponse){
     
                });
    je récupère bien toutes les valeurs dans mon controller mais est-ce une bonne pratique ?

    Par ailleurs, donnez-vous des cours ou tutorat car je cherche un expert qui pourrait m'accompagner sur ces problématiques ?

    D'ailleurs je ne sais pas si je peux demander cela içi donc veuillez m'en excuser par avance

  6. #6
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Bonjour,

    Si vous avez beaucoup de formulaires qui ne reprennent qu'une partie des formulaires, les modèles sont la meilleure solution pour bien garder un code simple à comprendre et à reprendre en maintenance.

    Pour le reste, je ne suis pas sûr de tout comprendre, mais vous avez deux solutions :
    • c'est le backend (Symfony) qui interroge le serveur google avec les fonctions curl. Votre controlleur construit alors une vue avec les données reçues comme s'il les avait lues dans une base de données ;
    • la seconde option, c'est votre front-end qui interroge directement Google et qui se passe donc totalement de votre backend.


    Pour savoir qu'elle est la meilleure solution, cela va dépendre de beaucoup de choses. Si vous avez besoin que votre backend améliore/traite/interprète/journalise les données de Google, vous devrez optez pour la première option.
    Si votre backend se moque de ce que Google renvoie ou non, alors autant libérer votre serveur de cela, alors vous pouvez opter pour la seconde solution.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

Discussions similaires

  1. include assert role
    Par Maria1505 dans le forum C++
    Réponses: 3
    Dernier message: 17/01/2007, 22h41
  2. [Débutant] Utilisation du mot clé ASSERT
    Par analysiz dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/07/2004, 11h43
  3. [role] Detecter le role des utilisateurs
    Par Dry dans le forum SQL
    Réponses: 5
    Dernier message: 28/04/2004, 17h06
  4. [Sécurité] Roles
    Par Mister Nono dans le forum Débuter
    Réponses: 4
    Dernier message: 06/12/2003, 11h55
  5. Creer un role au niveau server
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/05/2003, 15h56

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