1

为了实现跨应用程序身份验证(如果用户已经登录到其他应用程序,则登录到我的 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 是否相同。

所以这是我的问题:为什么旧的应用程序会话变量不可用,如何从我的侦听器类中获取它们?

4

2 回答 2

1

如此处所述,Symfony2 使用会话包来存储会话内容。这意味着您必须直接访问$_SESSION超全局才能获得此类功能。

于 2013-02-06T02:22:39.327 回答
0

对我来说,解决方案是直接使用 php session fonctions。我还必须检查两个应用程序上的会话名称、域和保存路径是否相同。

在我的 symfony 中,我必须添加:
session_save_path('c:/wamp/tmp');
会话名称(_SESSION_ID_);
session_start();
然后使用 $_SESSION

另一种给我但我没有使用的方法是直接使用会话文件,如下所示:

“诀窍是使用浏览器发送的会话 cookie。

例如,一个用 PHP 编写的旧 Web 应用程序向浏览器发送了一个名为 IntranetSession 的 cookie。因为我知道 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>





希望这会有所帮助!

于 2014-04-23T07:38:34.777 回答