背景
あるプロジェクトにSecurityコンポーネントを導入してみましたが、
BlackHoleに直行してしまうという問題にはまりましたので、デバッグの仕方を共有します。
環境
PHP 5.6
CakePHP 2.x
解説
Securityコンポーネントは、Formヘルパーと弱い関連を持っています。
※実際にクラス同士が関連を持っているわけではなく "_Token"
というリクエストパラメータでつながっています。
そのため、デバッグするときはSecuritytコンポーネントだけではなく、Formヘルパー側も意識する必要があります。
公式ドキュメントでの記載箇所は以下
CakePHP 2.x Cookbook:セキュリティ
CakePHP 2.x Cookbook:FormHelper - セキュリティコンポーネントを使う
処理の流れ
かなり省略した図ですが、以下がSecurityコンポーネントとFormヘルパーの処理の流れです。
- **1.2: generateToken()**で、リクエストパラメータ配列に
"_Token"
をセットしています。
ここではhashを生成しているだけなので、ここでデバッグしてもあまり意味がありません。 - **2.1.1: secure()**は、
"_Token"
がリクエストパラメータ配列にセットされていた場合に呼び出され、hiddenフィールドとしてTokenの値を出力しています。
ここでToken生成のロジックを見ることができますので、デバッグしてみると良いです。
ちなみにTokenは、フォームのフィールド情報のhash値です。
また、この処理はendメソッドから呼び出されるので、view側でendを呼んでいないと実行されません。 - **1.1: blackHole()**は、不正なリクエストと判断した場合に呼び出されます。
大抵はTokenのチェックに引っかかった場合に呼び出されると思われます。
ここのチェックロジックでデバッグして、生成ロジック側と見比べれば、どこが異なっているのかが分かると思います。
まとめ
なにかとはまるSecurityコンポーネントですが、
デバッグ箇所さえ把握できれば、問題はすぐに解決すると思います。