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 :

[fosUserBundle] redirection dynamique après login [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut [fosUserBundle] redirection dynamique après login
    Bonjour,


    En fonction de l'endroit ou on se trouve je voudrais faire une redirection après le succès du login.

    http://monsite/ici1/
    http://monsite/ici2/


    j'utilise fosUserBundle et ça ne doit pas être en fonction d'un rôle.



    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
    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
     
    jms_security_extra:
        secure_all_services: false
        expressions: true
     
    security:
        encoders:
            "FOS\UserBundle\Model\UserInterface": sha512
     
        role_hierarchy:
            ROLE_ADMIN:       [ROLE_USER]       # On a dit que l'admin héritait des droits d'auteur et de modérateur
            ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] # On garde ce rôle superadmin, il nous resservira par la suite
     
        providers:
            fos_userbundle:
                id: fos_user.user_manager
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            # Firewall principal pour le reste de notre site
            main:
                pattern: ^/                      # ^/ = tout ce qui commence par / = tout notre site
                form_login:                      # On définit notre méthode d'authentification
                    provider:    fos_userbundle  # On lit l'authentification au provider définit plus haut
                    remember_me: true            # On active la possibilité du "Se souvenir de moi" (désactivé par défaut)
                    # par défaut, le formulaire de login *doit* être un POST,
                    # et pas un GET
                    post_only: true
                    # options de redirection lorsque le login a réussi (vous
                    # pouvez en lire plus ci-dessous)
                    always_use_default_target_path: false
                    default_target_path:            /
                    target_path_parameter:          _target_path                
                    use_referer: true                       
     
                remember_me:
                    key:         %secret%        # On définit la clé pour le remember_me (%secret% est un parametre de parameters.ini)
                anonymous:       true            # On autorise les utilisateurs anonymes (non identifiés)
                logout:          true            # On autorise la déconnexion manuelle (désactivé par défaut)
     
     
        access_control:
             - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }         
             - { path: ^/GestionDesPages, roles: IS_AUTHENTICATED_ANONYMOUSLY }      
             - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
             - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
             - { path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY }
             - { path: ^/GestionDesPages/page-edition, roles: ROLE_USER }          
             - { path: ^/GestionDesPages/page-encours, roles: ROLE_USER }           
             - { path: ^/, roles: ROLE_USER }

  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
    Bonjour,

    Tu peux créer un service "login_handler" qui sera appelé pour rediriger.
    suis cet exemple:
    http://www.reecefowell.com/2011/10/2...loginhandlers/

  3. #3
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    merci arno99,

    j'ai toutefois un message d'erreur :
    ServiceNotFoundException: The service "security.firewall.map.context.main" has a dependency on a non-existent service "acme_user_security.component.authentication.handler.login_success_handler".
    app/config/config.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
    24
    25
     
    ...
     
    parameters:
        acme_user_security.component.authentication.handler.login_failure_handler.class: Acme\UserBundle\Component\Authentication\Handler\LoginFailureHandler
        acme_user_security.component.authentication.handler.logout_success_handler.class: Acme\UserBundle\Component\Authentication\Handler\LogoutSuccessHandler
     
     
    services:
        twig.extension.text:
           class: Twig_Extensions_Extension_Text
           tags:
               - { name: twig.extension }
     
        acme_user_security.component.authentication.handler.login_failure_handler:
            class:  %acme_user_security.component.authentication.handler.login_failure_handler.class%
            arguments:  [@service_container, @router, @security.context]
            tags:
                - { name: 'monolog.logger', channel: 'security' } 
        acme_user_security.component.authentication.handler.logout_success_handler:
            class:  %acme_user_security.component.authentication.handler.logout_success_handler.class%
            arguments:  [@service_container, @router]
            tags:
                - { name: 'monolog.logger', channel: 'security' }
    ...
    app/config/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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    ...
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            # Firewall principal pour le reste de notre site
            main:
                #pattern:    .*
                form_login:
                    provider:       fos_userbundle
                    login_path:     /login
                    use_forward:    false
                    check_path:     /login_check
                    success_handler: acme_user_security.component.authentication.handler.login_success_handler
                    failure_path:   null
                logout:
                    path:   /logout
                    target: /
                    success_handler: acme_user_security.component.authentication.handler.logout_success_handler
                anonymous:  true   
     
                remember_me:
                    key:         %secret%        # On définit la clé pour le remember_me (%secret% est un parametre de parameters.ini)
                anonymous:       true            # On autorise les utilisateurs anonymes (non identifiés)
                logout:          true            # On autorise la déconnexion manuelle (désactivé par défaut)
    ...



    Acme/UserBundle/Component/Authentication/LoginSuccessHandler.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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?php
    namespace Acme\UserBundle\Component\Authentication\Handler;
     
    use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\SecurityContext;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Routing\Router;
     
    class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
    {
     
        protected $router;
        protected $security;
     
        public function __construct(Router $router, SecurityContext $security)
        {
            $this->router = $router;
            $this->security = $security;
        }
     
        public function onAuthenticationSuccess(Request $request, TokenInterface $token)
        {
     
            if ($this->security->isGranted('ROLE_SUPER_ADMIN'))
            {
                $response = new RedirectResponse($this->router->generate('category_index'));            
            }
            elseif ($this->security->isGranted('ROLE_ADMIN'))
            {
                $response = new RedirectResponse($this->router->generate('category_index'));
            } 
            elseif ($this->security->isGranted('ROLE_USER'))
            {
                // redirect the user to where they were before the login process begun.
                $referer_url = $request->headers->get('referer');
     
                $response = new RedirectResponse($referer_url);
            }
     
            return $response;
        }
     
    }
    Acme/UserBundle/Component/Authentication/LogoutSuccessHandler.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
    27
    28
    29
    30
    31
     
    <?php
     
    namespace Acme\UserBundle\Component\Authentication\Handler;
     
    use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Bundle\FrameworkBundle\Routing\Router;
     
    class LogoutSuccessHandler implements LogoutSuccessHandlerInterface
    {
     
        protected $router;
     
        public function __construct(Router $router)
        {
            $this->router = $router;
        }
     
        public function onLogoutSuccess(Request $request)
        {
            // redirect the user to where they were before the login process begun.
            $referer_url = $request->headers->get('referer');
     
            $response = new RedirectResponse($referer_url);        
            return $response;
        }
     
    }


  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Salut,

    Je t'invites à aller faire un tour ici pour l'implémentation de symfony

    Et pour la déclaration en xml de ce bout de code la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <service id="security.authentication.success_handler" class="%security.authentication.success_handler.class%" abstract="true" public="false">
                <argument type="service" id="security.http_utils" />
                <argument type="collection" /> <!-- Options -->
            </service>
    récupéré
    ici

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Juste au cas ou, fait app/console container:debug pour voir si ton service est bien créé

  6. #6
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    merci, je suis arrivé au bout grâce à vous


    les exemples qu'on trouve sur internet sont truffés d'erreurs à ce sujet.
    peut être qu'avec le passage en version 2.1 des choses changes(je ne sais pas).
    quoi qu'il en soit, voici ce que j'ai fais pour que ça tourne en symfony 2.2 :

    app/config.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
     
    services:
    ...
     
        acme_login_success_handler:
            class:  Acme\UserBundle\Component\Authentication\Handler\LoginSuccessHandler
            arguments:  [@router, @security.context]
            tags:
                - { name: 'monolog.logger', channel: 'security' } 
        acme_logout_success_handler:
            class:  Acme\UserBundle\Component\Authentication\Handler\LogoutSuccessHandler
            arguments:  [@service_container, @router]
            tags:
                - { name: 'monolog.logger', channel: 'security' }

    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    ...
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            # Firewall principal pour le reste de notre site
            main:
                #pattern:    .*
                form_login:
                    provider:       fos_userbundle
                    login_path:     /login
                    use_forward:    false
                    check_path:     /login_check
                    success_handler: acme_login_success_handler
                    failure_path:   null           
                logout:
                    path:   /logout
                    target: /
                    success_handler: acme_logout_success_handler
                anonymous:  true

    Acme\UserBundle\Component\Authentication\Handler\LoginSuccessHandler.pchp
    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
     
    <?php
    namespace Acme\UserBundle\Component\Authentication\Handler;
     
    use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\SecurityContext;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Routing\Router;
     
    class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
    {
     
        protected $router;
        protected $security;
     
        public function __construct(Router $router, SecurityContext $security)
        {
            $this->router = $router;
            $this->security = $security;
        }
     
        public function onAuthenticationSuccess(Request $request, TokenInterface $token)
        {
            if ($this->security->isGranted('ROLE_SUPER_ADMIN'))
            {
                $response = new RedirectResponse($this->router->generate('category_index'));            
            }
            elseif ($this->security->isGranted('ROLE_ADMIN'))
            {
                $response = new RedirectResponse($this->router->generate('category_index'));
            } 
            elseif ($this->security->isGranted('ROLE_USER'))
            {
                // redirect the user to where they were before the login process begun.
                $referer_url = $request->headers->get('referer');
     
                $response = new RedirectResponse($referer_url);
            }  
     
            return $response;
        }
     
    }

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Et ou sont les erreurs dans ton code au dessus que nous n'avons donc pas vu ?

  8. #8
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    acme_user_security.component.authentication.handler.login_failure_handler:
            class:  %acme_user_security.component.authentication.handler.login_failure_handler.class%
            arguments:  [@service_container, @router, @security.context]
    il y a 3 arguments au lieu de 2, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
            arguments:  [ @router, @security.context]
    et divers erreurs de syntaxe, une confusion entre login_failure_handler et login_success_handler

  9. #9
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    attention: pour le login ça fonctionne bien par contre le logout, rien ne se passe.

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

Discussions similaires

  1. [2.x] FOSUserBundle redirection après erreur de login
    Par seriux55 dans le forum Symfony
    Réponses: 0
    Dernier message: 08/05/2015, 18h04
  2. [2.x] redirection FOSUSER aprés login
    Par caroen dans le forum Symfony
    Réponses: 4
    Dernier message: 08/12/2013, 09h28
  3. Redirection Web apres Login ?
    Par MadCat34 dans le forum Lotus Notes
    Réponses: 1
    Dernier message: 20/06/2009, 17h13
  4. redirection après login et mdp
    Par kinkinhxc dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2008, 20h13
  5. Redirection après login
    Par dolf13 dans le forum Langage
    Réponses: 1
    Dernier message: 24/05/2006, 03h13

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