Drupal で、ログイン時に独自の処理を加える方法

ユーザーがログインしたときに何か処理を加えたいケースを考える。たとえばある決められた時刻の間はログインを許して、そうでない場合はログインを許可しない、といったシナリオである。 まず Drupal には hook_auth というのがあるのでこれにあたりをつけた。しかし、この hook_auth という hook は、ユーザー名@サーバ名のときに機能し、単にユーザー名だけ入力された場合にはスルーされてしまうとここに書いてある。2005年のアーティクルなんだけれども、https://drupal.org/node/29147 には延々と議論が続いているが、ユーザー名だけのときの場合はスルーというルールは変わらないらしい。実際に私も試してみたが、そういう仕様になっている。 私のところではユーザー名@サーバ名という運用ルールにしていなかったので、いまさらユーザーにそのようにログインすべしと伝えられるはずもなく、結局、hook_auth という方法は使えないということがわかった。 ではどうするかというと、hook_user を使う。この hook は何でもアリの hook で、ユーザーがログイン・ログアウトしたり、ユーザーページで値を設定したりしたときに開発者が独自の好きなアクション(処理)を書けるようになっている。なのでログイン直後に独自の処理を加えるには、以下のような感じでコードを書くことになる。
function yourmodulename_user($op, &$edit, &$user, $category = null) {

  switch($op) {

    case 'login':

      global $user;
      $_user = $user;

      if(条件に合わなかったら) {
        // セッションを破棄して
        session_destroy();
        // 強制ログアウトしてしまう
        module_invoke_all('user', 'logout', NULL, $user);
        // ログにも残そう
        watchdog('yourmodulename', "あなたのメッセージ for <i>$user->name</i>" );
        // Anonymous user をロード
        $user = drupal_anonymous_user();
        // デフォルトのページ(ノード)に飛ぶ
        drupal_goto('node');
        break;
      }

    // 成功したとき
    watchdog('yourmodulename', "Authentication successful for <i>$user->name</i>" );
    $user = $_user;
    break;
  }
}
トラックバック URL: https://perltips.twinkle.cc/trackback/175