現在ログインしているユーザーをログアウトさせずに、プログラムで別のユーザーになりすます


9

エラーが発生した場合、モジュールがグローバルの値を変更し、$user独自のコードを実行し$user、現在のユーザーをログアウトさせずにの元の値を復元するにはどうすればよいですか?


これに関しては未解決の古い問題があり、複数回呼び出された場合でも、これを適切に処理できる関数が追加されています。drupal.org/node/287292を参照してください。そこでパッチを確認してテストしてください。
Berdir 2011

1
drupal.orgでDrupal 6、Drupal 7、およびDrupal 8の別のユーザーを偽装するソリューションを備えたコミュニティドキュメントの作成:安全に別のユーザーを偽装する
iStryker 2014

回答:


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()。これにより、特定のユーザーが特定のプロセスを実行するための特定の権限を設定したように見せかけるなど、恐ろしいことを行うことができます。原理は同じです。
グレッグ

このコードの部分で1つの潜在的な問題のみ。古いセッションを変数$ old_sessionに保存する必要があります。保存セッションをfalseに設定し、最後にdrupal_save_session($ old_session)に設定します。
iStryker 2014

他のユーザーとしてdrupal.org/project/phantomjs_captureを使用して画面にアクセスしてキャプチャします。それは可能/トリッキーですか?(drupal.org/node/2899252を発行してください)。
2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.