web-dev-qa-db-ja.com

drupalユーザーCookieを設定する方法

次のコードでは、プログラムで任意のユーザーにログインしましょう。

global $user;
$user = user_load(<any_uid>);

私の質問は、上記のコードがブラウザに新しいユーザーCookieを設定するためにどのようにトリガーされるかです。この時点では、セッションを再生成することすらありません。

5
arpitr

次のコードでは、プログラムで任意のユーザーにログインしましょう。

ではない正確に;現在のグローバルユーザーオブジェクトをユーザーのインスタンスに設定しますが、アカウントにログインしたり、セッションに触れたりすることはありません。グローバルユーザーオブジェクトに依存するリクエストで発生する多くのことは、アカウントがログインした場合がログインした場合と同じように動作しますが、 、およびアカウントに関連付けられたセッションはありません(いずれにせよ)。

Cookieはリクエストの最後に _drupal_session_commit_ で追加されます:

_if (!drupal_session_started()) {
  drupal_session_start();
  if ($is_https && variable_get('https', FALSE)) {
    $insecure_session_name = substr(session_name(), 1);
    $params = session_get_cookie_params();
    $expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
    setcookie($insecure_session_name, $_COOKIE[$insecure_session_name], $expire, $params['path'], $params['domain'], FALSE, $params['httponly']);
  }
}
_

方法の副産物としてDrupalはセッションを初期化します(遅延フックで))最初のセッションが初期化される前に$user = user_load(<any_uid>);への呼び出しが発生した場合、セッションは_user_load_行が実行されない場合でも、そのユーザー用に初期化され、次のリクエストに対して「ログイン済み」と表示されます。

ただし、_hook_user_login_は呼び出されず、ユーザーテーブルの最後のログイン列は更新されません。これは完全な「ログイン」ではなく、特定のユーザーのセッションを初期化するだけです。

ちなみに、別のユーザーのセッションがすでに存在しているときに$user = user_load(<any_uid>);を呼び出すと、次のリクエストのセッションはその別のユーザーのセッションになります。 _<any_uid>_のセッションで上書きされることはありません。

7
Clive