跳转到主要内容
Joanna 提交于 3 October 2014

原文链接:https://www.drupal.org/node/218104

改变的时候到了?

这里将讨论一个问题,那就是将题述的功能推动到核心部分,这样一来开发者不必去记住是如何安全进行的:#287292: Add functionality to impersonate a user

模仿的可能性

你或许有很多次都想让你的代码能够“模仿”其他用户。举个例子,当一个用户采用某种方式去触发其他进程的时候,如果那个进程是作为一个不同的用户来工作,那么此时你就会想要去模仿那个用户。

下面是一些非安全模仿其他用户的示例代码:

<?php
global $user;
$original_user = $user;
$user = user_load(array('uid' => 1));
//假装你是id为1的用户,然后把事件写在这里(在网站上通常为管理员用户)
//注:-这是不安全的部分-如果你的代码在这里失效,用户立刻会有id为1的用户权限!
$user = $original_user;
?>

要想安全地去模仿,就要使用session_save_session()(D6)或drupal_save_session()(D7)功能,如下所示:

D6部分:

<?php
global $user;
$original_user = $user;
$old_state = session_save_session();
session_save_session(FALSE);
$user = user_load(array('uid' => 1));
//假装你是id为1的用户,然后把事件写在这里(在网站上通常为管理员用户)
//如果代码失效,这将不成为问题,因为会话没有保存
$user = $original_user;
session_save_session($old_state);
//从这里开始的$user开始恢复正常,因此会话得以保存
?>

D7部分:

<?php
global $user;
$original_user = $user;
$old_state = drupal_save_session();
drupal_save_session(FALSE);
$user = user_load(1);
//假装你是id为1的用户,然后把事件写在这里(在网站上通常为管理员用户)
//如果代码失效,这将不成为问题,因为会话没有保存
$user = $original_user;
drupal_save_session($old_state);
//从这里开始的$user开始恢复正常,因此会话得以保存
?>