为了实现跨应用程序身份验证(如果用户已经登录到其他应用程序,则登录到我的 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 }
但是$session->get('nomUtilisateur')
总是返回 NULL(并且$session->all()
只$_SESSION
返回一些 Symfony2 特定的变量),尽管其他应用程序将所有这些数据存储在会话中。
当然,我对两个应用程序使用相同的 cookie 会话域(在 config.yml 中配置),我可以轻松检查 PHPSESSID 是否相同。
所以这是我的问题:为什么旧的应用程序会话变量不可用,如何从我的侦听器类中获取它们?