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

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

#1楼 票数:1 已采纳

如前所述这里 ,Symfony2中使用会话袋来存储会话的东西。 这意味着您必须直接访问$_SESSION超全局变量才能使用此功能。

#2楼 票数:0

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

在我的symfony中,我必须添加:
session_save_path('c:/ wamp / tmp');
session_name(_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>





希望这可以帮助!

  ask by Michaël Perrin translate from so

未解决问题?本站智能推荐:

1回复

如何从第三方应用程序访问Symfony的数据/业务层

我有以下不依赖我且无法更改的体系结构方案: 一台服务器/机器上有多个php应用程序和一个postgres数据库:每个应用程序使用其自己的架构,以便逻辑上分离应用程序的数据。 我正在使用Symfony开发一个新的应用程序-以A表示的应用程序,该应用程序管理和存储应由其他应用程序部分访问的
2回复

如何在第三方应用程序中使用会话Symfony2执行授权

我对以下情况有疑问: 在我的Symfony2应用,其用户已登录,开放第三方应用程序(filenamager为TinyMCE的)。 如何使用SF2应用程序的凭据授权用户? 如果用户在登录页面上检查remember_me ,则该工作: //Bootstrap of 3rd party ap
1回复

如何在Symfony应用程序中扩展第三方捆绑软件的特定文件?

因此,我有一个使用ezPublish的网站(其本身基于Symfony 2.8)。 为简单BinaryContent.php ,我有一个文件BinaryContent.php ,其中包含位于以下位置的类BinaryContent : /vendor/ezsystems/ezpublish-
1回复

在旧版应用程序和Symfony2之间桥接会话数据

抱歉,在我找不到此问题之前,是否已提出此问题。 我找不到想要的答案。 我有一个要用Symfony2重建的旧应用程序,不幸的是,我需要并行运行一段时间,直到完成整个系统的重建。 我需要使symfony能够访问旧的会话数据才能起作用的部分。 我是在Symfony网站上找到的: http
1回复

让不同的Symfony2应用程序使用相同的会话/登录?

我有四个Symfony 2.1应用程序,我希望它们共享相同的会话/登录系统,以便登录一个可以让你进入其他应用程序。 所有应用程序都在同一个域和服务器上,因此它们可以正确地获取cookie。 由于某种原因,他们仍然无法交换。 它们都具有在properties.yml指定的相同secret
1回复

Symfony2中的ZendFramework1应用程序-会话问题

我已将我们的旧网站添加到我们新的Symfony应用程序中的旧版主机中。 我有会话问题。 如果我使用Symfony的默认会话处理程序,我会得到以下内容: 但是,如果我使用会话php_bridge作为遗留应用程序集成的建议(很可能不是为此而是为$ _SESSION)然后网站加载但会话将不
1回复

在应用程序外获取会话(Symfony)

我在\\ web文件夹中创建了一个php文件(这意味着在应用程序之外对吗?),我在应用程序内的会话中(在控制器动作中)设置了变量,但无法在应用程序外(在应用程序中)获取该会话外部php文件)。 我的会议总是空的。 这是我设置会话的控制器动作 这是外部文件
5回复

如何获取Symfony2应用程序的根目录?

从控制器内部获取根应用程序目录的最佳方法是什么? 是否可以将其置于控制器之外? 现在我通过将它(从参数)作为参数传递给服务来获取它,如下所示: 在 Symfony2 中是否有更好、更简单的方法来获取这些信息?