为了实现跨应用程序身份验证(如果用户已经在其他应用程序中登录,则在我的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是否相同。
所以这是我的问题:为什么旧的app会话变量不可用,我如何从我的监听器类中获取它们?
答案 0 :(得分:1)
如上所述here,Symfony2使用会话包来存储会话内容。这意味着您必须直接访问$_SESSION
超全局才能获得此类功能。
答案 1 :(得分:0)
对我来说,解决方案是直接使用php会话功能。 我还必须检查两个应用程序的会话名称,域和保存路径是否相同。
在我的symfony中,我必须添加:
session_save_path( 'C:/瓦帕/ TMP');
会话名称(_SESSION_ID_);
在session_start();
然后使用$ _SESSION
给我的另一种方式,但我没有使用的是直接使用会话文件,如下所示:
“诀窍是使用浏览器发送的会话cookie。
例如,用PHP编写的旧Web应用程序发送了一个cookie
将IntranetSession称为浏览器。因为我知道PHP存储在哪里
会话文件,我只是打开该文件,并解码其内容
使用session_decode()。这样做的缺点是session_decode()
将其输出直接输入$ _SESSION,覆盖当前
会话数据(甚至是Symfony放在那里的东西)。基本上是规则
如下:
$sessionData = file_get_contents($sessionFile);<br>
$tmpSess = $_SESSION;<br>
session_decode($sessionData);<br>
$otherAppSession = $_SESSION;<br>
$_SESSION = $tmpSess;<br>
“
希望这有帮助!