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 :

Héritage de Controller, bloquage de traitement [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut Héritage de Controller, bloquage de traitement
    Bonjour, je me suis mis depuis peu à Symfony2 et j'aurais une question par rapport aux Controller. Je vous explique le principe.

    Je possède deux Controller A et B qui nécessitent que l'utilisateur soit connecté avant d'exécuter n'importe quelle méthodeAction.
    Ce que j'aimerais, c'est que A et B héritent d'un controller X qui vérifie si l'user est connecté et si ce n'est pas le cas, qu'il bloque l'exécution et donc que les méthodes appelées (de A ou B) ne s'exécutent pas.

    Pour le moment, voici un exemple de ce que j'ai.

    Classe Mère : X
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class ConnectController extends Controller
    {
     
        public function isConnected()
        {
        	return ($this->get('session')->get('user_id') != null);
        }
     
        public function renderNoConnect()
        {
        	return $this->render('template_pour_connexion');
        }
     
    }
    Exemple classe fille : A ou B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class AController extends ConnectController
    {
     
        public function indexAction()
        {
        	if(!parent::isConnected())
        		return parent::renderNoConnect();
     
            return $this->render('templateA');
        }
    }

    Ici, si l'user n'est pas connecté lors de l'appel de la méthode index de AController, la template pour la connexion va s'afficher. Ce code est pas mal redondant puisqu'il va falloir copier/coller la condition dans toute les méthodes du controller A ...

    J'ai essayé quelques tricks avec _call(), mais sans succès.
    Si certain on des idées, je suis preneur, merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Le système natif de sécurisation permet déjà de faire tout cela.
    http://symfony.com/doc/current/book/security.html

    pourquoi ne pas l'utiliser ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Merci, c'est ce dont j'avais besoin, mais je ne comprend pas tout.
    Par exemple, comment restreindre l'accès à une route uniquement si l'utilisateur est connecté.
    J'entend par là que je dois faire la liaison entre security.yml et ma session('user_id').

    Ça ressemblerais à quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    firewalls:
        zone_protected:
            pattern:    ^/(zone1|zone2|zone3)$
            form_login: /connexion
    Donc si j'ai bien compris, lorsqu'on arrive sur une route zone1 ou zone2 ou zone3, on va être redirigé vers /connexion.
    Mais ce que je voudrais, c'est dire à quelles condition on redirige. Et cette condition, c'est user_id=null

    J'espère être assez clair

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    En fait je ne vois pas comment ça peut être automatique puisque la création de session('user_id') n'est pas produit par symfony.
    J'aurais très bien pu appeler ma variable session autrement.
    La doc fournie trop d'info, je suis noyé dans les Roles etc, ce que je veux est au final assez simple, mais je vois vraiment pas comment ça fonctionne.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    bien sur que si que t'as la session, récupère le Token

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get('security.context')->getToken()

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Le but est de tout configurer dans security.yml non ?
    Donc à quoi sert ton bout de code ? ^^

    Ce que je veux, c'est uniquement rediriger l'internaute vers une page de login quand sa variable session user_id est à null. Rien de plus.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si c'est juste ça faut bien configurer ton security.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    firewalls:
        login:
            pattern:  ^/login$
            security: false
     
        main:
            pattern:    ^/
            form_login:
                check_path: /login_check
                login_path: /login
            logout:
                path:   /logout
                target: /

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Waou, ca marche mais alors il va falloir m'expliquer parceque ça me semble un peu trop magique oO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    firewalls:
     
            login:
                pattern:  ^/connexion$
                security: false
     
            main:
                pattern:  ^/post
                form_login:
                    check_path: /connexion
                    login_path: /connexion
                logout:
                    path:   /logout
                    target: /
    En gros ici je protège ma page post.
    Quand je ne suis pas connecté et que je me rend sur /post, la redirection vers /connexion a bien lieu, et une fois que je me suis logué, la page post s'affiche.

    C'est exactement ce que je voulais, mais ce que je ne comprend pas c'est comment symfony a su que l'authentification s'était bien passé ?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    parce que l'utilisateur est en session

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Qu'est ce que tu appel utilisateur ?
    Quand l'internaute n'est pas logué, il possède quand même une variable session user_id à null.
    Lors d'un succès de connexion, je modifie juste cette variable. Ce serait cette modification de l'objet session qui permettrait d'autoriser l'accès ?
    Dans ce cas, imaginons que lors d'un échec d'authentification je modifie aussi cette variable, alors cela devrait être interprété comme un succès (ce qui ne sembles pas être le cas avc mes tests).

    J'aimerais essayer d'y voir plus clair :p

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    l'utilisateur est celui qui se connect, t'as pas toucher à la session utilisateur, c'est déjà fait en interne tout ça,
    t'as quel provider pour les utilisateurs ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    En fait je me suis un peu enflammé, ça ne fonctionne pas.
    Lorsque je vais sur /post en non connecté, on me redirige vers la page de connexion, mais lorsque je suis connecté et que je retourne sur /post, on me redirige vers l'index ...

    Je n'utilise pas de provider je crois. Voici mon fichier :

    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
    42
    43
    44
    45
    46
    47
    security:
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
     
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            login:
                pattern:  ^/connexion$
                security: false
     
            main:
                pattern:  ^/post
                form_login:
                    check_path: /connexion
                    login_path: /connexion
                logout:
                    path:   /logout
                    target: /
     
            secured_area:
                pattern:    ^/demo/secured/
                form_login:
                    check_path: /demo/secured/login_check
                    login_path: /demo/secured/login
                logout:
                    path:   /demo/secured/logout
                    target: /demo/
                #anonymous: ~
                #http_basic:
                #    realm: "Secured Demo Area"
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si ton provider est la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    providers:
            in_memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
    montre ton controller pour "connexion"

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Connexion
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?php
     
    namespace Jmt\JmtBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Jmt\JmtBundle\Entity\User;
     
     
    class ConnexionController extends Controller
    {
     
        public function indexAction()
        {
        	if($this->get('session')->get('user_id') != null)
        		return $this->redirect($this->generateUrl('index'));
     
        	$user = new User();
        	$form = $this->createFormBuilder($user)
        			->add('login', 'text')
            		->add('password', 'password')
            		->getForm();
     
        	$request = $this->get('request');
     
        	if($request->getMethod() == 'POST')
        	{
        		$form->bindRequest($request);
        		if($form->isValid())
        		{
        			$userDB = $this->getDoctrine()->getEntityManager()->getRepository('JmtJmtBundle:User')
    						->findOneBy(array('login' => $user->getLogin(), 'password' => $user->getPassword()));
     
    				if($userDB != null)
    				{
    					$session = $this->get('session');
    					$session->set('user_id', $userDB->getId());
    		        	return $this->redirect($this->generateUrl('index'));
    		        }
        		}
        	}
     
            return $this->render('JmtJmtBundle:Connexion:index.html.twig', array(
            	'form' => $form->createView(),
        	));
     
        }
     
     
        public function logoutAction()
        {
        	$this->get('session')->set('user_id', null);
        	return $this->redirect($this->generateUrl('index'));
        }
     
    }

    Post
    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
    <?php
     
    namespace Jmt\JmtBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     
     
    class PostController extends Controller
    {
     
        public function indexAction()
        {
        	return $this->render('JmtJmtBundle:Post:index.html.twig');
        }
    }

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Ok je vois,
    Avec Framework Symfony tout ça est déjà gerer

    T'as ni a toucher à la session, ni à faire de requete pour vérifier que l'utilisateur est connecté. Le lien que je t'ai passé est peu être long mais faut quand même tout lire, parce que là, ton appli n'est pas sécurisé et tu vas avoir plein de problèmes après.

    Donc met le SecurityController par defaut (en changeant bien tes routes)

    et pour ton providers met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    security:
        encoders:
            Le\Namespace\du\bundle\User:plaintext
    ...
        providers:
            main:
                entity: { class: JmtJmtBundle:User, property: login }

    et pas oublier le formulaire qui va avec

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Ok, merci pour ton aide.
    J'ai finalement opté pour la solution du FOSUserBundle.

    Je commence à bien mieux comprendre le principe, mais j'ai cependant une erreur assez bizarre lorsque je vais sur ma page /register (que ej n'ai pas avec les autres route comme logout, profile etc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Could not load type "fos_user_registration_form"
    Si ça dit quelque chose à quelqu'un ...

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    quel était le besoin pour prendre le FOSUerBundle ?

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Je suis tombé sur un tuto pas mal expliqué, et ça m'évitais de gérer les formulaire de connexion, inscription etc, à la main.
    Et puis toute la gestion de l'user est automatisé, c'est pas mal. Mais du coup j'ai ce problème très bizarre.

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    le tuto datait de quand ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 15
    Dernier message: 03/02/2012, 12h06
  2. héritage de Control et Concepteur graphique de VS
    Par juniorAl dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/03/2009, 11h17
  3. Héritage User Control
    Par Guy025 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/08/2008, 21h45
  4. [XAML] Héritage de controle
    Par anthyme dans le forum Silverlight
    Réponses: 8
    Dernier message: 07/05/2008, 15h06
  5. héritage user control
    Par salihovic dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/12/2007, 12h45

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