3

我正在开发一个由 2 个应用程序(前端和后端)组成的 symfony 项目,我被要求在后端手动创建第二个会话,以便管理员无需登录即可从后端访问用户数据(前端) . 我在 factory.yml 中设置了不同的名称,以便每个应用程序都有自己的 cookie。Basicalyy,我需要从后端检索用户,手动创建前端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,而是一个难以猜测的单独字符串
  • 在前端创建一个接受key作为参数的模块/动作,在数据库中找到对应的用户,并登录

然后,您可以在后端生成所需的链接,管理员可以单击并重定向到这些链接。

不是很安全,请确保您的密钥很长。您可能需要添加代码以防止暴力破解,并通过 IP 地址限制对操作的访问?

您还可以要求管理员用户的密钥,并检查它是否也有效,这样就更难猜了。

于 2015-03-20T19:34:53.803 回答