$$hashKeyのせいでCakePHPのBlackHoleに引きずり込まれたよ
ものすごーーーーーーーーーーーーーーっっっっく久しぶりにスタッフブログを書く龍司です。
最近、NetCommons3を触るようになってからCakePHPとAngularJSをよく使うようになりました。
この組み合わせでちょっとはまったのではまった点について。
CakePHPのセキュリティコンポーネントを使うとフォームからのPOSTに対して下記の様なガードが働くようになります。
- CSRF対策のトークンが一致しなきゃダメ
- フォームヘルパで作成したフィールド名から増えちゃダメ
- hiddenで埋めた値が変更されてたらダメ
一見とても便利そうなんですが、そもそも自由にフォームをつくるためにCakePHPのFormヘルパつかってませんとかになると、引っかかりまくることになります。
今回ちょっと引っかかったのはAngularJSと組み合わせて複数レコードをまとめて更新するようなフォームをつくってたときです。
CakePHPのFormヘルパで出力するフォーム名とAngularJSの変数の形をあわせていったんですが、配列のポストするときに自分では全く指定してない $$hashKeyなんてキーの値がポストされてました。
これ、調べてみたらAngularJSが配列のユニークキーとして使ってる値らしいですね。いつ追加されるかわからないですが、ng-model と関連づけるためかな?
でこの値をもったたま配列をCakePHPにPOSTしちゃうとセキュリティコンポーネントがBlackHole反応しちゃうので、POSTする前に$$hashKeyを削ってやる必要があります。
やり方は下記の様な感じ。
angular.fromJson(angular.toJson($scope.params));
一旦Json文字列にシリアライズすると$$hashKeyは削除されたJson形式の文字列になるので、そうしてからもういちど配列にもどす感じですね。
セキュリティコンポーネントのBlackHoleに吸い込まれちゃったら$$hashKeyがくっついてないか確認してみてくださいね〜