Security Component は不正なアクセスをブロックする便利なコンポーネントですが、その分ハマるポイントも多いです。
というか、公式サイトに細かい情報が載っていません。まぁ、コード読めってことなんでしょうが、困りますね。
というわけで、ハマるポイントをまとめてみます。
手書きのフォームは禁止
デザイン上うまく制御できないなどで手書きでフォームを書くことがあるかもしれませんが、Security Componentを使うなら厳禁です。
ハッシュ値は$this->Form->end()で埋め込まれるので、自分で
</form>
とか書いてはダメです!
Formヘルパーを使ったとしても受け付けてくれない書き方
$this->Form->input('User.name', array('type'=>'text','name'=>'user_name')); // name属性は指定できません
フォームで配列を使うときは
$this->Form->input('User.type.' . (int)$i, array('type' => 'checkbox')); // NG
このように数字を前に持ってくるか、数字でなければOKのようです
$form->input('User.' . (int)$i . '.type', array('type' => 'checkbox')); // OK $form->input('User.type.hoge', array('type' => 'checkbox')); //OK
hidden値をjavascriptなどで書き換えてはだめ
これ、結構使うことが多いんですよねぇ…
チェック対象外にするには
コントローラー内のbeforeFilterでdisabledFieldsで対象外のフィールドを指定することができます。
チェックは、アクション実行前にされるので、beforeFilterでしかできません。
function beforeFilter() { $this->Security->disabledFields = array('Hoge.test'); }
ただ、コントローラー全体に効いてしまうので、必要ならアクションを見て場合分けをして処理する必要があります。
また、textフィールド等ならjavascriptの書き換えは可能ですのでhiddenの代わりにdisplay:noneなtextフィールドを作ってしまうという方法もあるようです。