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 }

ただし、他のアプリはこのすべてのデータをセッションに保存しますが、常に NULL を返します (そして、いくつかの Symfony2 固有の変数のみを$session->get('nomUtilisateur')返します$session->all()) 。$_SESSION

もちろん、両方のアプリに同じ Cookie セッション ドメインを使用し (config.yml で構成)、PHPSESSID が同じであることを簡単に確認できます。

ここで私の質問があります: 古いアプリ セッション変数が利用できないのはなぜですか? また、リスナー クラスからそれらを取得するにはどうすればよいですか?

4

2 に答える 2

1

hereで述べたように、Symfony2 はセッションバッグを使用してセッションのものを保存します。$_SESSIONこれは、そのような機能のためにスーパーグローバルに直接アクセスする必要があることを意味します。

于 2013-02-06T02:22:39.327 に答える
0

私にとっての解決策は、php セッション関数を直接使用することでした。また、セッション名、ドメイン、保存パスが両方のアプリケーションで同じかどうかを確認する必要がありました。

私の symfony では、以下を追加する必要がありました:
session_save_path('c:/wamp/tmp');
session_name(_SESSION_ID_);
session_start();
次に $_SESSION を使用します

私に与えられた別の方法は、次のようにセッション ファイルを直接使用することでしたが、私は使用しませんでした

たとえば、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 に答える