3

2 つのアプリケーション (フロントエンドとバックエンド) で構成される symfony プロジェクトに取り組んでおり、管理者がログインせずにバックエンドからユーザー データ (フロントエンド) にアクセスできるように、バックエンドで 2 つ目のセッションを手動で作成するように求められました。各アプリケーションが独自の Cookie を持つように、factory.yml に異なる名前を設定しました。基本的に、バックエンドからユーザーを取得し、バックエンド セッションを破棄せずにフロントエンド Cookie を手動で作成し、フロントエンドにリダイレクトする必要があります。次のコードを試しましたが、うまくいきません:

$user = $this->getUser()->getAttribute('some_attribute');
$session = new sfSessionStorage();
$option  = array(
    'session_name' => 'frontend_session_name'
); 
$session->initialize($options);
// some code to push the user in the new cookie

$this->redirect('https://frontend.php');

私は長い間 symfony を使用しておらず、ここで少し迷っていることを認めなければなりません。新しい Cookie にユーザー データを入力する必要があることはわかっていますが、その方法がわかりません。どんな助けでも大歓迎です。

編集:推進力を使用していることを忘れていました。編集#2:意図したことを行う次のソリューションを思いつきました:

$user = $this->getUser()->getAttribute('some_attribute'); //retrieving the user whose data I'd like to access
$currentSessionId = session_id();
session_write_close();
session_name('frontend_session_name');
session_start();
session_regenerate_id();
$_SESSION['symfony/user/sfUser/culture'] = 'en';
$_SESSION['symfony/user/sfUser/lastRequest'] = time();
$_SESSION['symfony/user/sfUser/authenticated'] = 1;
$_SESSION['symfony/user/sfUser/credentials'] = array('frontend_user');
$_SESSION['symfony/user/sfUser/attributes'] = array(
  'symfony/user/sfUser/attributes' => array(
      'user' => $user
  )
);
session_write_close();
session_name('backend_session_name');
session_id($currentSessionId);
session_start();

$this->redirect('/frontend.php');

そのため、手動でセッションを再作成し、必要なデータをプッシュしました。助けようとした人に感謝します。

4

1 に答える 1

0

セッションを共有することは選択肢にないように思われるため、次のことをお勧めします。

  • IDではなく、推測しにくい個別の文字列で、ユーザーごとに一意のキーを作成します
  • キーをパラメーターとして受け入れるモジュール/アクションをフロントエンドに作成し、データベースで対応するユーザーを見つけてログインします

次に、管理者がクリックしてリダイレクトできる必要なリンクをバックエンドで生成できます。

あまり安全ではありません。キーが長いことを確認してください。総当たり攻撃を防ぐコードを追加し、アクションへのアクセスを IP アドレスで制限する必要がありますか?

また、管理者ユーザーのキーを要求し、それが有効であることを確認することもできます。これにより、推測が難しくなります。

于 2015-03-20T19:34:53.803 に答える