ユーザーがログインしたときに何か処理を加えたいケースを考える。たとえばある決められた時刻の間はログインを許して、そうでない場合はログインを許可しない、といったシナリオである。
まず 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