ひとりまとめ

もろもろのメモ

cakePHP AuthComponentが使えない!?

cakePHPで提供されている認証の仕組みを使って、ログイン・ログアウトで制限するページを作ってみました。参考にしたのはこちら。
5.2 認証

やり方は、次の3stepでした。

1) テーブルの準備--------------
Userテーブルに
 username
 password
という2つフィールドを作る。

2)コンポーネントの定義----------
このAuthComponentを使いたいControllerの中で
 var $components = array('Auth');
と定義する。

3)アクションの定義--------------
UserControllerに
 function login() {
 }

 function logout() {
  $this->redirect($this->Auth->logout());
 }
というログイン、ログアウトのアクションを指定してあげる。


これだけで、パスワードは暗号化されて保存されるようだし、一定時間経過すると再度ログインを要求されるし、とっても簡単に実現できてしまいました。楽勝だ!!


調子に乗って他の処理を実装していたら、ユーザー情報を処理するあたりでなんかおかしな動きをすることに気がつきました。具体的には、このAuthComponentをつかうとidやusernameなどを
 $this->Auth->user('id')
のようにして取得できるのですが、うまくとれない場合があるみたい。おかしいなあ・・・と思ってあれこれページ遷移をすると、あるタイミングでログインページが表示されるのです。もっと見ていくと状況は逆で、「タイムアウトしているにもかかわらずログイン画面に飛ばされない」場合があるみたいです。
つまり、認証のかかっているページが表示できてしまうけれど、状態としてはログアウトのためにidなどのユーザー情報が取得できていない という感じです。


原因はわからないのですが、現象としてわかったのは「アクション名がキャメル記法(?)になっていると、ログインしなくても表示できてしまう」ということでした。
たとえばsearch()というアクション名だと認証がかかるけどもsearchName()みたいなことにすると認証不要でアクセスできてしまいました。


日本語版のマニュアルには書いてなさそうですが、英語版では書いてあるのか。はたまたそもそもこういう書き方が推奨されないのか、こうなるのが当たり前の仕様なのか。。。う〜〜ん。もっと勉強しなくては。

現時点ではひとまず、途中に大文字を含むようなアクション名を避けるってことで実装して逃げようかと思います。

追記 ***************************************************

この問題はCakePHP 1.2.1.8004などのバージョンで発生するようです。2009/4/3時点の最新版CakePHP1.2.2.8120では発生しませんでした。同様の現象が発生された方は、CakePHPを最新版にアップデートすると解決する可能性があります。