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 :

Conditions (valid, banned) dans form Login


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 37
    Par défaut Conditions (valid, banned) dans form Login
    Bonjour, j'ai un projet sur Symfony 4.2 et sur le form login je pêche depuis un bon moment...
    Mon formulaire fonctionne très bien avec le code de la doc de d'éditeur trouvée ici :
    https://symfony.com/doc/current/secu...rm_login_setup

    Par contre je doit personnalisé les conditions, ajouter des contraintes (isValid && !isBanned), mais comment faire
    Le Controller du login ne traite pas la validation c'est un obscur fichier de symfony... Je pense qu'il doit y avoir moyen de rajouter ces contraintes dans config/packages/securiy.yaml ou d'intercepter la $_POST dans le Controller du login mais je trouve pas d'infos sur ça...
    Ni sur une autre idée pour obtenir le même résultat.

    Merci de votre aide

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 37
    Par défaut
    Merci pour ton temps dukoid mais je ne trouve pas de réponse à cette adresse. J'ai déjà fait des recherches et je suis déjà tomber sur cette page.
    Dans tous mes autres formulaires j'aurais appliquer cette méthodologie mais là il s'agit du LOGIN, qui ne passe pas par une instance de Form classique (comme indique la doc de symfony ici : https://symfony.com/doc/current/secu...rm_login_setup).

  4. #4
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    il faut surcharger l'action de login du controlleur pour y inserer tes conditions
    ou surcharger le validator et y ajouter tes propres contraintes

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 37
    Par défaut
    J'ai finalement trouvé une voie, en utilisant le Repository de User et la méthode loadUserByUsername. Code fonctionnel ci-dessous (modifications à apportés à la version disponible ici : https://symfony.com/doc/current/secu...rm_login_setup)

    Deux petit problèmes :
    - Le message d'erreur est unique pour le cas où loadUserByUsername renvoi NULL, un message indiquant "Compte invalide", un autre pour "Compte suspendu" se serait bien, mais je pêche pour l'instant...
    - La vérification du Recaptcha me plaît pas trop, ma clé privée GoogleApi ne risque pas d'être afficher par un utilisateur malin depuis la variable $_ENV ???
    (Oui car j'en avait pas parler avant mais un autre problème que j'avais c'était d'intercepter le form login pour faire un test de captcha)

    Dans src\Repository\UserRepository.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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
     
    namespace App\Repository;
     
    //Symfony
    use Doctrine\ORM\EntityRepository;
    use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
    //Entity
    use App\Entity\User;
    use App\Entity\Recaptcha;
     
    class UserRepository extends EntityRepository implements UserLoaderInterface {
     
        public function loadUserByUsername($email) {
            if (ReCaptcha::isCheck($_ENV['RECAPTCHA_PRIVATE_KEY'])) {
                return null;
            }
            return $this->createQueryBuilder('u')
                            ->where('u.email = :query AND u.status != 0 AND (u.banned_at IS NULL OR u.banned_at < :now)')
                            ->setParameter('query', $email)
                            ->setParameter('now', new \DateTime('now'))
                            ->getQuery()
                            ->getOneOrNullResult();
        }
     
    }
    Dans config\packages\security.yaml
    Code yaml : 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
    security:
        providers:
            from_database:
                    entity:
                        class: App\Entity\User
     
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: true
     
                logout:
                    path: /logout
                    target: /
     
                form_login:
                    check_path: login
     
        access_control:
             - { path: ^/admin, roles: ROLE_ADMIN }
     
        encoders:
            App\Entity\User:
                algorithm: bcrypt
                cost: 12

    Dans templates\security\login.html.twig
    Code twig : 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
                <form action="{{ path('login') }}" method="post" class="col-md-8">
                    <div class="form-group">
                        <label for="email">Email</label>
                        <input id="email" name="_username" type="text" class="form-control" value="{{ last_username }}">
                    </div>
                    <div class="form-group">
                        <label for="password">Mot de passe</label>
                        <input id="password" name="_password" type="password" class="form-control">
                    </div>
                    <div class="checkbox">
                        <label>
                            <input type="checkbox" name="_remember_me"> Se souvenir de moi
                        </label>
                    </div>
                    <div class="g-recaptcha pb-2" data-sitekey="{{ recaptchaPublicKey }}"></div>
                    <div>*Champ(s) obligatoire(s)</div>
                    <button type="submit" id="login" name="login" class="btn btn-primary" >Se connecter</button>
                </form>

    Dans src\Controller\SecurityController.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("/login", name = "login")
         */
        public function login(Request $request, AuthenticationUtils $authenticationUtils) {
            $lastUsername = $authenticationUtils->getLastUsername();
            $recaptchaPublicKey = $_ENV['RECAPTCHA_PUBLIC_KEY'];
            $error = $authenticationUtils->getLastAuthenticationError();
            //LOOK THE src\Repository\UserRepository.php FILE FOR EDIT THE CONDITIONS TO VALID LOGIN !!!
            if ($error) {
                $this->addFlash("danger", "Informations incorrectes : soit vous avez commis une erreur d'identifiants, soit votre compte n'est pas valide (adresse mail non validée, compte suspendu ...)");
            }
            return $this->render('security/login.html.twig', [
                        "recaptchaPublicKey" => $recaptchaPublicKey,
                        'last_username' => $lastUsername,
    //                    'error' => $error,
            ]);
        }
    J'espère que ça pourra aider Je te remercie encore dukoid pour ta bienveillance et ta réactivité mais la pertinence ou la clarté des informations fournie laisse à désirer je pense.

    Je laisse le sujet ouvert, au cas ou un solution aux petits soucis m'apparaisse votre aide est la bienvenue

  6. #6
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    là, je pense que tu es sur la mauvaise voie.

    https://symfony.com/doc/current/secu...gin_setup.html


    LoginFormAuthenticator.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
    18
    19
    20
    21
     
     
    ....
    ....
     
        public function getUser($credentials, UserProviderInterface $userProvider)
        {
            $token = new CsrfToken('authenticate', $credentials['csrf_token']);
            if (!$this->csrfTokenManager->isTokenValid($token)) {
                throw new InvalidCsrfTokenException();
            }
     
            $user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);
     
            if (!$user) {
                // fail authentication with a custom error
                throw new CustomUserMessageAuthenticationException('Email could not be found.');
            }
     
            return $user;
        }


    dans la fonction getUser :

    tu as ce bout de code !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            if (!$user) {
                // fail authentication with a custom error
                throw new CustomUserMessageAuthenticationException('Email could not be found.');
            }
    inspire toi de ça pour ajouter isBanned et isValid avec les messages d'erreurs appropriés !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Afficher les erreurs de validation d'un form dans une modalbox
    Par phpestpuissant dans le forum Symfony
    Réponses: 1
    Dernier message: 12/12/2012, 12h44
  2. Réponses: 4
    Dernier message: 03/09/2007, 11h03
  3. Réponses: 3
    Dernier message: 02/12/2004, 08h50
  4. Réponses: 6
    Dernier message: 24/09/2004, 13h10
  5. [C#] Validation d'une form
    Par royrremi dans le forum ASP.NET
    Réponses: 3
    Dernier message: 31/05/2004, 22h23

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