cakephp1.2のAuthコンポーネントで、ログイン失敗時のリダイレクトの注意点

凄くハマったんだけど、いくつかの要因が重なり合っていて、やっと解決したのでメモ。

■条件
・cakephp1.2使用時
・AuthComponent使用時
・FormHelper::create()を使用時
です!

■現象
(1)ログインが必要な画面を表示
(2)ログイン画面へリダイレクト
(3)ログインに失敗
(4)再びログイン画面が表示される
(5)再度入力(今度は正しい値)
(6)なんかログインでできねー

ちなみに、一発で正しい値を入力した場合は、以下の様な流れ。
(1)ログインが必要な画面を表示
(2)ログイン画面へリダイレクト
(3)正しい値でログイン
(4)無事(1)の画面へリダイレクトされる

なんて使えないんだ!cakephp!
一回こっきりかよ!と思って、あーでもないこーでもないとソースを眺めていたら、いろんなことがわかりました。


■原因
FormHelperのcreateメソッドが悪さしている!!


というのも、なんでかしらんけど勝手に引数を引き継いじゃうのよね、彼。
例えば、

ログインIDを「hogehoge」って入力した場合、viewはこんな感じ
echo $form->create('User', array('action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
で、書かれていると、最初のログイン画面の時のアクションは
form action="/users/login"
って出力されるのに、一回「hogehoge」ってIDで失敗すると
form action="/users/login/hogehoge"
ってなります。

ま、これが原因ですわな。
ここのURLが変わってしまうと、Authコンポーネントが保存しているログイン後のリダイレクト先が変更されちゃうのよね。
正確には、
「現在のURL」と「ログインURL」が違ったら、「ログイン後のリダイレクト先」を上書きする
という仕様になっている模様。


なので、こんな感じでviewを書き変えてあげる。
echo $form->create('User', array('action' => 'login', 'id' => null));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
これで出なくなるんよねー。

これ、もう「id」で決め打ちされているので、「username」の値が入ってきても「'id' => null」ってしてやるのがキモ。


※2010/6/30追記
上のやり方だとうまくいかない場合は素直に
echo $form->create('User', array('url' => '/users/login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
とURLを直接指定してやればOK。

コメント

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com