【CakePHP2.x】AuthComponentによるログイン処理でハマった些細で重要なこと

tmb_cakephp03

CakePHPの勉強にとログイン機能を実装することにしました。執筆時点ではまだ当サイトには適用していませんが、おおむねできています。やり方は本家Cookbookなど、ググればたくさん出てきます。そのまま実装すればうまくいきます。。。と言いながらハマったことを書きます。

スポンサーリンク

再ログインの動作がおかしい

実装してテストをしたところ、

  • ログイン⇒ログアウトは正常にできる。
  • ログイン⇒ログアウト⇒再ログインができない。

具体的には再ログイン時、再度ログイン画面が描画され、もう一度ログイン処理を行うとログインできるというものでした。1回目のログインはうまくいって2回目のログインがうまくいかない。ログイン処理自体が間違っていたら最初からログインできません。ログアウト処理に問題があるのか?Sessionを消していないのか?フレームワークを使用する際に困ることは、何かあったときに自分が実装していないため、仕様がわからないことです。理解するには他人が書いたソースを紐解くしかありません。AuthComponentのログイン処理ができなくて困ってる人はネット上にいましたが自分と同じ人は見つかりませんでした。

原因判明

原因は以下のソースでした。何がおかしいかわかるでしょうか?

public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array(
                'controller' => 'User',
                'action' => 'main'
            ),
            'logoutRedirect' => array(
                'controller' => 'User',
                'action' => 'login'
            ),
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => 'Blowfish'
                )
            )
        )
    );

UsersControllerにてAuthComponentの使用を宣言し、ログイン時、ログアウト時の遷移先を指定しています。ログインが成功したらhttp://hoge/user/mainへ遷移し、ログアウト時にはhttp://hoge/user/loginに遷移するように指定しています。この文章とソースに答えはあります。

答え

public $components = array(
    ~中略~
            'logoutRedirect' => array(
                'controller' => 'User',
                'action' => 'login'
            ),
    ~中略~
        )
    );
‘controller’ => ‘User’と’U’が大文字になっていたのが原因でした。ログアウト処理実行時、以下の動作となっています。
  • AuthComponentの指定どおり、http://hoge/User/loginに遷移
  • ログイン前はhttp://hoge/user/login以外遷移できないので、http://hoge/User/loginからhttp://hoge/user/loginへ飛ばされる(AuthComponentにてログインしていない場合、http://hoge/user/login以外へのアクセスを認めていない)
  • AuthComponentの仕様により、ログイン前にログイン認証後にアクセスできるページへ遷移しようとした場合、Session(Auth.redirect)にアクセスしようとした認証後のページURLが代入され、ログイン画面に戻る。
  • ログイン処理成功時、前述したSessionのURLへ遷移する。つまりhttp://hoge/user/loginからhttp://hoge/User/loginへ遷移する。(これもAuthComponentの仕様でSessionに遷移先が格納されていた場合、AuthComponent使用宣言時に設定したloginRedirectの設定値よりも優先して使用される。)

CakePHPでは(と言っていいかわかりませんが)、URLの大文字と小文字で別と認識しているようでした。ブラウザ上は区別されず同じページが表示されます。だから、ログイン画面が2回表示されていたのです。コントローラ名はアッパーキャメルという規約があるので、てっきり大文字で指定するのかと勘違いしました。ちょっとこの辺の仕様はまだ曖昧ですが、いずれにせよ原因はリダイレクト先を大文字指定していたためで、小文字に変えたら無事に再ログインも一発でできるようになりました。

まとめ

ちょっとこれは何に対する理解が足りないのか難しいところですが、ちょっとしたミスでハマってしまいました。もしこの内容に誤り等あればコメント欄でじゃんじゃん突っ込んでください。

スポンサーリンク

この記事が気に入っていただけたらシェアお願いします。励みになります。
prev あなたの技術力は自己採点で何点ですか。 next 採用ご担当者様へ

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です