CakePHP2 において、AppController で SecurityComponent を導入していると
ちょっとでも怪しい動きをしようもんなら、なんでもかんでもブラックホールに吸い込まれますw
orz…. The request has been black-holed.
ある程度CSRF対策とかが出来るので非常に便利なコンポーネントなのですが…。
たとえばポータルサイトのトップページでのユーザの動きって
検索してみる→望みの検索結果じゃなかった→戻るボタンで戻る→再度同じ検索フォームに入力→検索 って人が多いと思うんですが(違う?)
この方法で、コンポーネントが有効だと、二回目の検索リクエストはTokenが違うのでブラックホール行きですw
ログイン中の情報操作などはもちろんトークン有効でばりばり働いて欲しいのですが、ログイン不要で誰でも使える部分はそこまでガチガチだと正直うざったいので、ここでは検索のアクション search だけSecurityComponentの対象から外せばいいわけです。
もちろん、CakePHPの標準ライブラリですから、そのようなダレでも思いつく機能は搭載されています。
SecurityComponentを無効化するアクションの指定
当該Controllerの beforeFilterに、設定してあげればいいだけ!
・・・なのだが、思い込みの強い私はここでハマる。
AuthComponentの除外指定方法は
$this->Auth->allow(‘detail’ ,’search’ , ‘hoge’ , ‘fuga); //Authを除外するアクション
と、列挙する形となっています。OKですね。
よっしゃ、じゃあSecurityも同じですよね!
$this->Security->unlockedActions(‘search’); // これでは動きません!
→Fatal Error (^^)
arrayにしたり、一個だけで試してみたり…ここで、25分ほど詰まる。キレるw。
で、正解は?
リファレンスはきちんと見ましょう。
AuthComponentはメソッドで指定するのに、Securityは変数指定でした(>_<)
[とあるContoller.php]
public function beforeFilter(){
parent::beforeFilter();
//ログインしなくてもアクセスできるアクションを登録する
$this->Auth->allow(‘detail’ ,’search’); //列挙
//Securityコンポーネントを外すアクションを指定
$this->Security->unlockedActions = array(‘search’,’fuga’ ,’hoge’) ; //arrayで!
}
思い込みは良くないですね…。さあ続き続き・・・・。
余談(動作がおかしいなとおもったら?…Cakeを疑うその前に)
SecurityComponent の恩恵にあずかるためには、$this->Form->end(); でちゃんとフォームを閉じないとダメ!
※ Form->submit() で終わった気になるんじゃねえ! その後ろにちゃんと end を書けよゴルア!
※ end() を書いて初めて hidden トークンが出力されるらしい