クロスアプリケーション認証 (ユーザーが既に他のアプリケーションにログインしている場合に Symfony2 アプリにログインする) を実装するために、ユーザーに関する特定のデータがセッションにあるかどうかをチェックする Symfony2 リスナー クラスを作成しました。このデータは、非 Symfony2 (ただし PHP) アプリから取得されます。
問題は、他のアプリからのセッション データが、クラスで使用するセッション オブジェクトに存在しないことです。
リスナー(簡略化)クラスは次のとおりです。
<?php
class OldAppAuthenticationListener
{
/** @var \Symfony\Component\Security\Core\SecurityContext */
private $context;
public function __construct(SecurityContext $context)
{
$this->context = $context;
}
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
// don't do anything if it's not the master request
return;
}
if (!$this->context->isGranted('IS_AUTHENTICATED_FULLY')) {
$request = $event->getRequest();
$session = $request->getSession();
$userName = $session->get('nomUtilisateur');
$token = new PreAuthenticatedToken($userName, null, 'secured_area', array('ROLE_USER'));
$session->set('_security_secured_area', serialize($token));
}
}
}
次のように services.yml に登録されます。
services:
my_app.listener.old_app_authentication:
class: Acme\MyAppBundle\Listener\MyAppAuthenticationListener
arguments: ["@security.context"]
tags:
- { name: kernel.event_listener, event: kernel.request }
ただし、他のアプリはこのすべてのデータをセッションに保存しますが、常に NULL を返します (そして、いくつかの Symfony2 固有の変数のみを$session->get('nomUtilisateur')
返します$session->all()
) 。$_SESSION
もちろん、両方のアプリに同じ Cookie セッション ドメインを使用し (config.yml で構成)、PHPSESSID が同じであることを簡単に確認できます。
ここで私の質問があります: 古いアプリ セッション変数が利用できないのはなぜですか? また、リスナー クラスからそれらを取得するにはどうすればよいですか?