原文链接: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开始恢复正常,因此会话得以保存 ?>