web-dev-qa-db-fra.com

Quelle est la bonne façon de forcer le démarrage d'une session?

Je porte actuellement le module SimpleFBConnect sur Drupal 8. Ce module utilise Facebook PHP SDK qui s'attend à ce que nous ayons établi une session avant que l'utilisateur ne soit redirigé vers Facebook pour l'authentification.

En lisant l'API SessionManager, j'ai supposé que SessionManager :: start démarrerait la session. Cependant, cela ne semble pas être le cas. La même chose s'applique à SessionManager :: save (la description indique que cette fonction "forcera la session à être enregistrée et fermée.").

La seule façon de forcer le démarrage d'une session était d'appeler SessionManager::regenerate.

Est-ce la bonne façon de forcer le démarrage de la session dans Drupal 8?

Code de débogage, qui montrera que SessionManager :: start ne démarrera pas la session.

class TestController extends ControllerBase {
  public function test() {
    $session_manager = Drupal::service('session_manager');
    $session_manager->start();

    if ($session_manager->isStarted()) {
      $msg = 'Sesssion started';
    }
    else {
      $msg = 'Sesssion not started';
    }

    return array(
      '#markup' => $msg
    );
  }
}
6
Markus Sipilä

Drupal démarre une session uniquement si à la fin de la demande le $_SESSION super global contient toutes les données. Les sessions vides sont activement détruites. Ceci afin de maximiser les taux d'accès au cache lors de l'exploitation d'un site derrière un serveur proxy inverse (par exemple Varnish).

Comme l'a déjà souligné @Berdir, la bonne façon de déclencher un démarrage de session dans Drupal est d'y stocker quelque chose. Cependant, le SDK Facebook essaie de protéger ses utilisateurs contre la perte de données due à mauvaise gestion de session. Selon le code source, cette fonctionnalité peut être désactivée via la méthode FacebookRedirectLoginHelper :: disableSessionStatusCheck () . Veuillez utiliser cela au lieu d'essayer d'imposer un démarrage de session.

2
znerol

D'accord, a trouvé la réponse à partir de cet enregistrement de changement: https://www.drupal.org/node/2228871

La session peut être démarrée de force comme ceci:

// Force session start if we don't already have a session.
$session = \Drupal::service('session');
if (!$session->isStarted()) {
  $session->migrate();
}
5
Markus Sipilä

Je pense que la seule façon de forcer une session est d'y stocker quelque chose.

Il n'y a aucun intérêt à le démarrer manuellement, car Drupal ne sauvegardera pas une session sans données de session, AFAIK.

Essayez donc de simplement mettre une clé factice dans $ _SESSION.

1
Berdir