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;
} }