以编程方式模拟另一个用户而不会导致当前登录的用户注销


9

如果发生错误,模块应如何更改global的值$user,执行其自己的代码并恢复的原始值,$user而又不导致当前用户注销?


关于这个问题,还有一个老问题,它增加了一个可以正确处理此问题的函数,即使多次调用也是如此。参见drupal.org/node/287292。请在那里检查并测试补丁。
2011年

1
创建了一个社区文档,该文档具有在drupal.org上模拟 Drupal 6,Drupal 7和Drupal 8的另一个用户的解决方案:安全地模拟另一个用户
iStryker

Answers:


18

drupal_cron_run()函数给出了确切一个很好的例子,因为它改变了当前用户匿名每当cron是运行,那么它完成后切换回。

// Prevent session information from being saved while doing funky stuff.
$original_session_state = drupal_save_session();
drupal_save_session(FALSE);

// Force the current user to anonymous to ensure consistent permissions on
// funky stuff runs.
$original_user = $GLOBALS['user'];
$GLOBALS['user'] = drupal_anonymous_user(); // Or use user_load() for a non-anonymous user.

// Do funky stuff here...

// Restore the user.
$GLOBALS['user'] = $original_user;
drupal_save_session($original_session_state);

值得一提的是,您可以将当前用户对象放在某个位置($GLOBALS为了安全起见,可以放置在另一个变量中或仅放置在另一个变量中),并通过使用加载它们来切换到任何用户user_load()。当特定用户设置了执行特定过程的特定权限时,这使您可以做一些可怕的事情,例如假面舞会。原理是一样的。
格雷格

这段代码只有一个潜在的问题。您应该将旧会话保存在变量$ old_session中。将保存会话设置为false,然后将其设置为drupal_save_session($ old_session)。
iStryker

使用drupal.org/project/phantomjs_capture作为其他用户访问和捕获屏幕。有可能/很奇怪吗?(请发布drupal.org/node/2899252)。
kiranking
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.