se connecter du backend vers le frontend avec un utilisateur

Pour certains projets, il peut être pratique de se connecter sur le compte d’un utilisateur parce qu’il est bloqué, pour vérifier que tout fonctionne bien, pour tester son application. Cependant les mots de passe sont cryptés en bases de données et sans connaître les identifiants il va être difficile de se connecter.
Donc ce petit tuto est là pour nous aider.
Le but est simple: dans le backend, on liste l’ensemble des utilisateurs du site et à coté de chaque nom on va rajouter un bouton « se connecter en tant que ».

Ainsi il suffit d’appuyer sur le bouton pour se retrouver sur le frontend, connecté avec cet user.

Tout d’abord nous créons un partial _connectWith.php dans le module souhaité dans le backend, par exemple le module sf_guard_user.

$link_connect_with = 'http://www.monsite.fr/connect_by_admin/'.$sf_guard_user->getSalt().'/'.$sf_guard_user->getPassword().'/'.$sf_request->getCookie('nomdemasessionbackend');
echo link_to('SE CONNECTER EN TANT QUE', $link_connect_with, array('target'=>'_blank'));

le $link_connect_with est défini à coté pour plus de lisibilité.
connect_by_admin est le nom de ma route.
getSalt et getPassword sont les méthodes de sf_guard_user pour récupérer les données correspondantes.
$sf_request->getCookie(‘nomdemasessionbackend’) avec nomdemasessionbackend qui doit être défini dans le fichier backend/config/factories.yml, on verra après son utilité.

all:
  storage:
    class: sfSessionStorage
    param:
      session_name: nomdemasessionbackend

pour simplifier, ici je n’ai pas utilisé de routing ou de fonction spéciale qui va récupérer automatiquement les routes du frontend, j’ai écris directement l’url souhaitée. C’est pas très beau mais plus facile pour ce tuto.
c’est tout pour le backend.

maintenant sur le frontend:
routing.yml je rajoute ma route appelée via le backend

connect_with:
  url: /connect_by_admin/:salt/:password/:admin
  param: { module: connect, action: Admin}

mon action:

  public function executeAdmin(sfWebRequest $request)
  {
   //etape 1
    $salt = $request->getParameter('salt', false);
    $password = $request->getParameter('password', false);
    $admin_session = $request->getParameter('admin', false);
 
   //etape 2
    $cookie = $this->getRequest()->getCookie('nomdemasessionbackend');
    if($admin_session != $cookie)
    {
      $this->forward404();
    }
 
    //etape 3
    $user = Doctrine::getTable('sfGuardUser')->findOneBySaltAndPassword($salt, $password);
    $this->forward404Unless($user);
 
   //etape 4
    $this->getUser()->signin($user);
    $this->redirect('@homepage');
  }

étape 1: je récupère les informations de l’url
étape 2: je vérifie si le cookie nomdemasessionbackend correspond à celui passé en paramètre, sinon ERREUR404.
Ceci oblige l’administrateur à être authentifié dans le backend pour pouvoir « se connecter en tant que ».
étape 3: je récupère l’utilisateur qui à ce salt et ce mot de passe, sinon ERREUR404.
étape 4: je connecte cet utilisateur sur le site et je redirige vers la homepage.

Nous avons rajouté lé vérification de la session du backend pour sécurisée cette url, mais cela implique que votre frontend et votre backend n’utilise pas les mêmes nom de sessions: voir http://www.lexik.fr/blog/symfony/symfony/utilisation-de-sfsessionstorage-dans-symfony-901

Un petit tips tout simple mais assez pratique.

Partagez cet article