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 :

La sécurité (de base) et plus


Sujet :

Symfony PHP

  1. #1
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut La sécurité (de base) et plus
    Après m'être battu avec la création d'une application hors d'une sandox (oui, on peut le faire ). Après m'être battu avec un p...n de menu en jQuery (bon, c'est beau, mais fonctionnellement (côté développeur), c'est de la m...e ).

    J'en arrive a vouloir activer la sécurité de base dans l'application.

    Donc je part sur la documentation de la sécurité qui ressemble à un magnifique gâteau à la crème, avec plein de zoli fruits confit, mais sous une coupole de verre blindé et sans le couteau pour le découper (au cas où tu passerais la coupole).

    Donc l'idée est une sécurité de façade (pour une maquette c'est largement suffisant) et c'est inclus, en principe, dans Symfony 2.

    La partie rajoutée dans le fichier de configuration :
    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
     
    security.config:
      providers:
        encoders:
          Application/Entity/MyUser: plaintext
        main:
          users:
            admin:      { password: admin, roles:[ ROLE_ADMIN, ROLE_SPUSER ] }
            demo:       { password: demo, roles: ROLE_SPUSER }
     
      firewalls:
        main:
          pattern:        /.*
          http-basic:     true
          logout:         true
    Une configuration minimaliste, mais j'ai des doutes sérieux sur cette partie de la configuration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        encoders:
          Application/Entity/MyUser: plaintext
    Application et le nom de mon application, pour le reste, je suis sensé utiliser l'objet user de base (d'après la doc de symfony). Si cette ligne n'est pas présente, le site plante lamentablement. Si elle est présente, la boite de demande d'identification s'affiche bien, mais l'authentification ne se fait pas (lol même pas pour afficher la barre de debug...) donc quelque soit le mot de passe et le nom d'user, juste ou pas, même punition, la boite se ré-affiche.

    Si quelqu'un à une idée... j'achète (enfin, faut pas exagérer non plus, c'est juste une expression )
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Salut

    Paf, encore moi!

    Alors, voici ce que j ai fait:

    J utilise la classe User fourni avec Symfony2 qui est celle par defaut.
    Symfony\Component\Security\User\User
    Cela donne ceci:

    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
    security.config:
        encoders:
            Symfony\Component\Security\User\User: plaintext
     
        providers:
            main:
                password_encoder: plaintext
                users:
                    rapotor: { password: azerty, roles: ROLE_USER }
     
        firewalls:
            main:
                pattern:    /.*
                http-basic: true
                logout:     true
     
        access_control:
            - { path: /.*, role: ROLE_USER }
    et si on veut utiliser un MD5 ou SHA1:
    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
    security.config:
        encoders:
            Symfony\Component\Security\User\User: md5
     
        providers:
            main:
                password_encoder: md5
                users:
                    rapotor: { password: ab4f63f9ac65152575886860dde480a1, roles: ROLE_USER }
     
        firewalls:
            main:
                pattern:    /.*
                http-basic: true
                logout:     true
     
        access_control:
            - { path: /.*, role: ROLE_USER }
    De mon coté, ca fonctionne comme sur des roulettes.

    Tu sais montrer ta classe MyUser?

    Cédric!
    Un petit si la réponse convient. Merci.

  3. #3
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Dans les mystères de la configuration de symfony...

    J'ai compris, je crois, le sens du chemin pour l'encoder. J'ai donc rectifié ma configuration et ... rien.

    J'ai repris la tienne, copié collé dans le config et ... rien.

    J'ai affiné la mienne (une petite erreur dans les enchainements de niveau en yaml que je n'avais pas vu et ... ça marche !

    La config donne
    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
     
    security.config:
      encoders:
          Symfony\Component\Security\User\User: plaintext
      providers:
        main:
          password_encoder: plaintext
          users:
            admin:      { password: admin, roles:[ ROLE_ADMIN, ROLE_USER ] }
            demo:       { password: demo, roles: ROLE_USER }
      firewalls:
        main:
          pattern:        /.*
          http-basic:     true
          logout:         true
      access_control:
         - { path: /.*, role: ROLE_USER }

    Va comprendre pourquoi la tienne a 98% identique ne passe pas ?

    Je travail avec la dernière version récupérée il y a 5 jours par git. Mais je ne vois pas de différences entre les deux configurations.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Tant que ça fonctionne

    Maintenant je tente d'utiliser une classe Doctrine pour utiliser des utilisateurs de la base de données...

    Je poste si je réussi!
    Un petit si la réponse convient. Merci.

  5. #5
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    OK.

    Je tenterais bien d'étendre un peu cette classe doctrine pour y intégrer, comme dans sfGuard, la notion de droits et de groupes.

    Mais ceci sera pour plus tard.

    Je suis ta réussite avec attention
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Ce n’était pas sans mal mais j'ai finalement vaincu!

    Alors, voici les choses ou j ai trébuché avec la solution:

    1. Entité
      Elle doit dépendre de "AccountInterface".
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      namespace Application\HelloBundle\Entity;
       
      use Symfony\Component\Security\User\AccountInterface;
       
      /**
       * Application\HelloBundle\Entity\Users
       */
      class Users implements AccountInterface
      {
      // et le reste avec les getters et setters
      }
      Comme il y a implémentation, il faut definir les fonctions manquantes:

      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
       
          /** 
           * Implementing the AccountInterface interface 
           */  
          public function __toString()  
          {  
              return $this->getUsername();  
          }  
       
          public function getRoles()  
          {  
              return array('ROLE_ADMIN');  
          }  
       
          public function eraseCredentials()  
          {  
       
          }
       
          public function getSalt()  
          {  
              return '';
          }
       
          public function equals(AccountInterface $account)  
          {  
              if($this->getUsername() == $account->getUsername())
                  return true;
       
              return false;
          }
      Notez que:
      • J ai mis par defaut ROLE_ADMIN a nos utilisateurs, a peaufiner apres.
      • le "salt" est vide. commencez par un vide avant de corser les choses


    2. Security config

      Les commentaires sont les suivants:
      • les pass en md5 dans la database
      • j ai desactivé le security check pour le profiler... sinon pas simple pour debug!
      • n oubliez pas de mettre le role "ROLE_ADMIN" pour la page a afficher en cas de succès... vu que vos utilisateurs sont "ROLE_ADMIN"


      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
      security.config:
          encoders:
              Application\HelloBundle\Entity\Users: md5
       
          providers:
              main:
                  password_encoder: md5
                  entity: { class: HelloBundle:Users, property: username }
       
          firewalls:
              profiler:
                  pattern:    /_profiler/.*
                  security:  false
              main:
                  pattern:    /.*
                  http_basic: true
                  logout:     true
       
          access_control:
              - { path: /.*, role: ROLE_ADMIN }
    3. Tout taper dans un bundle "SecurityBundle"

      Bah, j'avais tout mis dans le HelloBundle! Rangeons un peu histoire de pouvoir reutiliser le bundle dans plusieurs projects!


    Allez hop, étape suivante : form_login avec les routing qui vont avec!
    Je regarde ca ce soir.
    Un petit si la réponse convient. Merci.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Allez, j enchaine.

    Je suis resté avec mon HelloBundle.

    Il faut tout d abord configurer le config!
    Avant de lire la suite, il faut savoir qu il y a des routes predefinies comme login, logout, login_check.

    Les changements par rapport a http-basic sont:
    • form_login: true a la place de http-basic
    • logout: { path: /logout, target: /login }
    • la partie "access_control" est ettofée. en fait il faut laisser l acces a la page de login pour que la personne s enregistre... sinon ca fait une boucle infinie sur /login! Et pour /login_check, idem!


    PS : N oubliez pas que si webprofiler est actif, il arrete les redirections volontairement en affichant le lien de redirection... histoire de debug a son aise! C'est la config intercept_redirects: true dans config_dev.yml !

    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
    security.config:
        encoders:
            Application\HelloBundle\Entity\Users: md5
     
        providers:
            main:
                password_encoder: md5
                entity: { class: HelloBundle:Users, property: username }
     
        firewalls:
            profiler:
                pattern:    /_profiler/.*
                security:  false
            main:
                pattern:    /.*
                anonymous:  true            
                form_login: true
                logout:     { path: /logout, target: /login }
     
        access_control:
            - { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /.*, role: ROLE_ADMIN }

    C est bien beau.... mais il va quand meme falloir parametrer les routes!
    Pour cela, rendez vous dans votre routing.yml de votre bundle.
    Pour moi, c est toujours mon pauvre HelloBundle, donc ca donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    hello:
        pattern:  /hello/{name}
        defaults: { _controller: HelloBundle:Hello:index }
     
    _security_login:
        pattern:  /login
        defaults: { _controller: HelloBundle:Securitylog:login }
     
    _security_check:
        pattern:  /login_check
     
    _security_logout:
        pattern:  /logout

    On remarque que l on route vers un controller! En effet, il va falloir creer un controller avec une action "login" et la vue qui va avec! voir la suite!


    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
    namespace Application\HelloBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Security\SecurityContext;
     
    class SecuritylogController extends Controller
    {
        public function loginAction()
        {
            // get the error if any (works with forward and redirect -- see below)
            if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
                $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
            } else {
                $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
            }
     
            return $this->render('HelloBundle:Securitylog:login.twig.html', array(
                // last username entered by the user
                'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,
            ));
        }
    }
    et la vue.... qui se trouve donc dans mon Application\HelloBundle\Ressources\views\SecurityLog\login.twig.html !

    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
    {% extends "HelloBundle::layout.twig.html" %}
     
    {% block content %}
        {% if error %}
            <div>{{ error }}</div>
        {% endif %}
     
        <form action="{{ path('_security_check') }}" method="post">
            <label for="username">Username:</label>
            <input type="text" id="username" name="_username" value="{{ last_username }}" />
     
            <label for="password">Password:</label>
            <input type="password" id="password" name="_password" />
     
            <input type="submit" name="login" />
        </form>
    {% endblock %}
    Rien de bien sorcier! J'espere que ca va aller
    Un petit si la réponse convient. Merci.

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    L'écran de saisie n'est nécessaire que si l'on utiliser un form_login pour l'authentification, non ? Si on en reste a http-basic il n'y a pas de nécessité de formulaire ?

    As-tu imaginé d'utiliser un form et sa validation en lieu et place d'un formulaire, somme toute des plus classique ? (et peut protégé). Je sais que c'est l'exemple de la documentation de Symfony 2, mais tant qu'à bien jouer avec le truc...

    Je me demande s'il ne serait pas possible de créer un bundle SecurityBundle avec un fonctionnement identique à celui de sfGuard ? Ce que tu as déjà abattu comme travail me conforte dans cette idée.

    Il y a des moments où j'ai l'impression de lire de la doc en anglais, de faire exactement ce qui est indiqué, bien sur, rien ne marche, et je retourne dans la doc qui, d'un coup, est passée en chinois !
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    ah mais ca existe déjà tout ca en bundle! je voulais juste faire tout ca par moi meme pour piger comment ca fonctionne.

    si tu veux le truc tout fait; ca s'appelle FOSUserBundle
    https://github.com/FriendsOfSymfony/UserBundle

    Cédric!
    Un petit si la réponse convient. Merci.

  10. #10
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Je vais me tester cela demain. Faut bien dormir, un peu
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    J'ai mis à jour vers la PR6.... ca ne fonctionne plus!!

    avec une liste d'utilisateurs dans "providers", cela fonctionne encore très bien.

    Dès que je tente de placer l'entité "Users" comme je l'avais essayé pour la PR5, cela ne fonctionne plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
                entity: { class: HelloBundle:Users, property: username }
    ...
    J'ai l'erreur suivante:

    Fatal error: Uncaught exception 'LogicException' with message 'Circular reference detected for service "security.context" (services currently loading: security.firewall.map.context.main, security.context, security.authentication.manager, security.user.provider.main, profiler_listener, profiler).' in D:\apache2\DATA\Symfony2\vendor\symfony\src\Symfony\Component\HttpKernel\bootstrap.php on line 99
    Si vous avez une bonne idée, je suis à l'écoute

    Cédric!
    Un petit si la réponse convient. Merci.

  12. #12
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Moi c'est l'autoload qui c'est fait la malle en passant en PR6.

    Et l'automate de création d'application renvoie un code qui n'est plus valide (oui, j'ai pris la dernière version).

    Du coup, je suis retourné dans la sandbox en attendant que l'orage se termine. Et la sandbox est en PR6. Essayes...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Salut,

    J'étais déjà en sandbox. J'ai tenté la derniere version de github, meme probleme.

    Je dois sans doute avoir un probleme de config quelque part...
    Un petit si la réponse convient. Merci.

  14. #14
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Quand je suis rentré dans la sandbox j'ai réécrit la partie configuration, ne gardant que les bundles.

    Les autres méthodes n'ayant pas réussis.

    A priori l'organisation interne des bundles et des composants de symfony a beaucoup été modifié dans cette version.

    Est-ce bon alors que la version définitive devait être présentée aux USA vendredi dernier ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  15. #15
    Membre régulier Avatar de Lideln75
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 111
    Points : 102
    Points
    102
    Par défaut
    RapotOR,

    Je suis arrivé sur ce forum car justement j'avais l'erreur que tu décris dans ton post de 10h52.
    En fait j'ai fait toutes tes manipulations (merci, d'ailleurs !) et du coup ça fonctionne chez moi (PR6).
    Donc ton code devrait normalement fonctionner, puisqu'il a corrigé cette erreur chez moi.
    Voici ma version du config.yml si jamais ça peut t'aider :
    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
     
    security.config:
        encoders:
            Ratethestar\MainBundle\Entity\Member: sha1
        providers:
            main:
                password_encoder: sha1
                users:
                    entity: { class: MainBundle:Member, property: pseudo }
        firewalls:
            profiler:
                pattern:    /_profiler/.*
                security:  false
            main:
                pattern:    /.*
                anonymous: true
                form_login: true
                logout:     { path: /logout, target: /login }
        access_control:
            - { path: /, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /inscription.html, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /liste_des_stars.html, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /.*, role: ROLE_ADMIN }
    L'interface a changé par rapport à ton précédent post, maintenant c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    use Symfony\Component\Security\Core\User\AccountInterface;
    En espérant que ça t'aidera, car tu m'as bien aidé (j'ai voulu utiliser plus tôt dans la soirée le bundle FOSUserBundle mais il ne fonctionne pas, il ne trouve pas la classe FileLocator, du coup je préfère le faire à la main)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Content que ca fonctionne pour toi avec quasi le meme code (sauf pour l'interface, effectivement, elle a changé de place).
    Je dois sans doute avoir une erreur plus bête que mes pieds à un endroit ou l'autre... je fatigue Dès que je trouve, je vous dis d'ou ca sortait!
    Un petit si la réponse convient. Merci.

  17. #17
    Membre régulier Avatar de Lideln75
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 111
    Points : 102
    Points
    102
    Par défaut
    Fonctionne, fonctionne... N'allons pas trop vite en besogne
    Je n'arrive pas à faire fonctionner l'authentification ORM, il me sort chaque fois un "bad credentials". Donc je vais plancher dessus et je vous tiens au courant quand j'arrive à me logger avec ce système

  18. #18
    Membre régulier Avatar de Lideln75
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 111
    Points : 102
    Points
    102
    Par défaut
    Youhou, ça fonctionne !

    Alors voici le fonctionnement global.

    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
     
    # routing.yml
     
    register:
        pattern: inscription.html
        defaults: { _controller: MainBundle:Home:register }
     
    _security_login:
        pattern: /connexion.html
        defaults: { _controller: MainBundle:Home:notLogged }
     
    _security_check:
        pattern:  /login_check
     
    _security_logout:
        pattern:  /deconnexion.html
    Je redirige vers une de mes actions lorsque l'utilisateur n'est pas loggé, afin de catcher la chose et je redirige ensuite vers la page d'inscription. Mais ce n'est peut-être pas obligatoire. Voir plus loin.

    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
     
    # config.yml
     
    security.config:
        encoders:
            Ratethestar\MainBundle\Entity\Member: sha1
        providers:
            main:
                password_encoder: sha1
                entity: { class: MainBundle:Member, property: email }
        firewalls:
            profiler:
                pattern:    /_profiler/.*
                security:  false
            main:
                pattern:    /.*
                anonymous: true
                form_login:
                    always_use_default_target_path: true
                    login_path: /connexion.html
                logout:     { path: /deconnexion.html, target: / }
        access_control:
            - { path: /liste_des_stars.html, role: ROLE_ADMIN }
            - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    Le changement se situe au niveau des providers. J'ai revérifié sur http://docs.symfony-reloaded.org/gui...ntication.html et il y avait bien une erreur de syntaxe dans ma config qui empêchait le tout de fonctionner (la clef "users" dans "providers" était de trop).

    Maintenant le 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
     
    	public function notLoggedAction()
    	{
    		$sError = '';
    		if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR))
    			$sError = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    		else
    			$sError = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
    		if (!$sError)
    			$sError = 'Vous devez vous inscrire ou vous identifier pour voir cette page.';
    		$this->get('request')->getSession()->setFlash('notLogged', $sError);
    		return $this->redirect($this->generateUrl('register'));
    	}
     
    	public function registerAction()
    	{
    		$sError = $this->get('request')->getSession()->getFlash('notLogged');
    		return $this->render('MainBundle:Home:register.html.php', array(
    			// last username entered by the user
    			'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
    			'sError'		=> $sError,
    		));
    	}
    Bon, là il y a un peu de tweaking à faire au niveau de la gestion des messages d'erreur car je n'ai pas vraiment une page de connexion, mais une page d'inscription. Et dans le header de mon site, j'ai le formulaire de connexion. Que voici d'ailleurs (assez standard) :

    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
     
    	<?php
    		$mUser = $view->container->get('security.context')->getUser();
    		if ($mUser && !is_string($mUser)) // Cas du null et du 'anon.'
    		{
    	?>
    			<div id="login">
    				<p>Bienvenue <?php echo $mUser->getPseudo(); ?></p>
    				<a href="<?php echo $view['router']->generate('_security_logout'); ?>">Déconnexion</a>
    			</div>
    	<?php
    		}
    		else
    		{
    	?>
    			<div id="login">
    				<form action="<?php echo $view['router']->generate('_security_check'); ?>" method="post">
    					<p>
    						<label for="loginEmail">Email</label>
    						<input id="loginEmail" type="text" name="_username" />
    					</p>
    					<p>
    						<label for="loginPassword">Password</label>
    						<input id="loginPassword" type="password" name="_password" />
    						<input type="submit" value="Ok" />
    					</p>
    					<a href="<?php echo $view['router']->generate('register'); ?>">Pas encore inscrit ?</a>
    				</form>
    			</div>
    	<?php
    		}
    	?>
    Et enfin, l'Entity de ma BDD "Member" :

    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
     
    use Symfony\Component\Security\Core\User\AccountInterface;
     
    class Member implements AccountInterface
    {
        // attributs et getters/setters de base
     
      	public function __toString()
    	{
    		return $this->pseudo;
    	}
     
    	public function getUsername()
    	{
    		return $this->email;
    	}
     
    	public function getRoles()
    	{
    		return array('ROLE_ADMIN');
    	}
     
    	public function eraseCredentials()
    	{
    	}
     
    	public function getSalt()
    	{
    		return '';
    	}
     
    	public function equals(AccountInterface $oAccount)
    	{
    		return ($this->getUsername() == $oAccount->getUsername());
    	}
    }
    Et avec ce code, cela fonctionne très bien, modulo :
    - l'affichage des messages d'erreur, genre mauvais mot de passe, membre inconnu, etc.
    - l'utilisation de l'interface AdvancedUserInterface
    - l'utilisation d'une Form au lieu de le faire à la main (quoi que, ptet inutile ici)

    Ah et aussi dernière chose : comment mettre à jour par exemple la date de "dernière action" de l'utilisateur lors de chaque affichage de page ?
    Il y a un bootstrap où on peut gérer ces choses-là ?

    J'espère que ça vous aidera !

  19. #19
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Citation Envoyé par Lideln75 Voir le message
    Ah et aussi dernière chose : comment mettre à jour par exemple la date de "dernière action" de l'utilisateur lors de chaque affichage de page ?
    Il y a un bootstrap où on peut gérer ces choses-là ?
    Avec la persistance dans Doctrine 2, tu peux peut-être garder ton objet user, le modifier et faire en flash, tout en le gardant près pour le prochain passage, ce qui va t'éviter une lecture de la base.

    Après, il faut exécuter le code... Je n'ai pas retrouvé la notion de filtre de la v1. Je n'ai pas trouvé d'événement à capturer, pourtant, c'est là qui faut chercher à mon avis. Si non, modifie le kernel. Autre possibilité à explorer. A l'initialisation du kernel, il initialise les budles de l'application. Possible qu'en triturant un méthode d'initialisation pour un de tes bundles...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    J'ai tout repris depuis une sandbox toute fraiche et en allant etape par etape depuis zero.... ca fonctionne! OUF!

    Je vais tenter ou j etais avant la PR6 : utiliser un "form".
    Un petit si la réponse convient. Merci.

Discussions similaires

  1. [Sécurité] Les failles les plus courantes
    Par Lootro dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 94
    Dernier message: 11/02/2008, 08h43
  2. vb.net et insertion de donnée dans une base sql plus
    Par anissabosch dans le forum VB.NET
    Réponses: 4
    Dernier message: 18/10/2007, 19h39
  3. [Sécurité] Connexion base de données
    Par jmayeux dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2007, 18h14
  4. Réponses: 2
    Dernier message: 23/11/2006, 14h17
  5. [Sécurité] Accès Base Distante sécurisée
    Par SansSucre dans le forum Access
    Réponses: 2
    Dernier message: 26/06/2006, 16h33

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