CakePHP 2.1: Использование защиты CSRF на элементах

У меня несколько особая ситуация с одним из моих действий CommentController, действием «добавить». Поскольку у меня есть форма «Добавить комментарий» в моем представлении «представление» PostsController, у меня есть элемент «add_comment» вместо представления «добавить» для комментариев. Это то, что я могу просто вставить элемент с формой внутри «просмотра» представления сообщений. Надеюсь, это не звучит слишком сложно.

Теперь внутри элемента «add_comment» форма подвергается фактическому действию «добавить» контроллера комментариев. Если форма должна быть отрисована снова, например, из-за недопустимого пользовательского ввода, форма снова отрисовывается, на этот раз, вызывая «добавить» представление комментариев. Это представление «добавить» снова включает только элемент «add_comment», который, как было сказано выше, включает в себя фактическую форму.

Теперь дело в том, что я добавил компонент Security в свой CommentController, чтобы получить защиту от CSRF. Все мои действия администратора CommentsController получают защиту, т. е. токен отображается внутри формы и проверяется при отправке формы.

Тем не менее, форма элемента add_comments НЕ получает токен. Вероятно, потому что это элемент, а не соответствующий вид.

Как я могу вручную вставить токен в форму элемента или как мне лучше решить эту проблему?

Спасибо

EDIT: См. также другой мой вопрос, касающийся настройки - он должен немного пояснить

EDIT2: Это то, что находится внутри моего элемента add_comment

EDIT3: Это вывод HTML элемента add_comment. Одноразовый номер должен быть в части <div style="display:none;">.

EDIT4: я поместил Debugger::log($this->Form->request->params); внутри элемента (add_comment.ctp) и представления (add.ctp) и это показывает вывод.

Я также загрузил весь CommentController (здесь). Обратите внимание, что я указал функцию черной дыры для обнаружения ошибок типа «auth». Это связано с тем, что каждый раз, когда я вводил недопустимые данные в элемент add_comments.ctp и — отправляя форму — вызывалось фактическое действие добавления контроллера комментариев (и, следовательно, добавление представления комментариев), я получал ошибку типа «черная дыра» типа «auth ', который я не мог объяснить, поэтому я уловил это таким образом - это может быть даже связано с моими проблемами.


person grssnbchr    schedule 21.08.2012    source источник
comment
Я не могу придумать причину, по которой это должно быть проблемой (и я использовал этот метод). Вы кешируете элемент? Форма комментариев случайно отображается внутри другой формы? Можете ли вы где-нибудь опубликовать вывод HTML элемента?   -  person jeremyharris    schedule 21.08.2012
comment
Элемент действительно кэшировался, что могло быть причиной, но теперь я удалил все кэширование, и оно все равно не работает (я также удалил фактические файлы кеша). Нет, форма комментариев не отображается внутри другой формы. См. редактирование вывода HTML.   -  person grssnbchr    schedule 22.08.2012
comment
Хорошо, мне нужно увидеть код контроллера. Также поместите debug($this->Form->request->params) в элемент и в представлении и давайте посмотрим на результат. Я предполагаю, что проблема заключается в том, как вы повторно визуализируете элемент, что я не совсем понимаю из вашего вопроса (код контроллера должен это прояснить).   -  person jeremyharris    schedule 22.08.2012
comment
Хорошо, я загрузил то, что вы хотите. Смотрите мою правку. Вывод отладки на самом деле не показывает ничего полезного, если вы спросите меня... Обратите внимание, что при повторном рендеринге элемента после отправки формы с недопустимыми данными строка Debugger::log() выполняется дважды, поскольку она находится в обоих элементах. и добавить вид. Также смотрите мои пояснения по настройкам, касающимся компонента Безопасность. Спасибо чувак!   -  person grssnbchr    schedule 23.08.2012
comment
Как странно! Вам не хватает ключа _Token в параметрах, который необходим для создания безопасных полей. Он даже отсутствует в представлении, что означает, что это может быть проблема с сеансом. Если вы отлаживаете $this->request->params в контроллере, вы должны увидеть там токен. Если вы этого не сделаете, он не будет установлен. Если вы доступны, мы должны обсудить проблему в чате, а не в комментариях.   -  person jeremyharris    schedule 23.08.2012
comment
Хорошо, пока спасибо. Я создам чат и постараюсь пригласить вас, когда мы будем в сети одновременно. РЕДАКТИРОВАТЬ, не знаю, как явно пригласить, но вот URL-адрес: chat.stackoverflow.com/rooms/15835/   -  person grssnbchr    schedule 27.08.2012
comment
Забудьте о чате — добавление компонента Security в PostsController решило проблему. Теперь форма add_comments имеет токен, а форма add.ctp также имеет токен, учитывая, что ввод недействителен. Как ни странно, когда я удаляю компонент Security из PostsController (только один в CommentController), обе формы, то есть элемент И представление, не имеют токена. Так что я действительно не понимаю, что происходит между этими двумя этапами, но в любом случае это работает (действительно работает, выдает ошибки при манипулировании токеном). Тем не менее спасибо за помощь!   -  person grssnbchr    schedule 27.08.2012
comment
Вау, да. Не знаю, как я это пропустил, это в первом предложении вашего вопроса. Думаю, я просто предположил, что у вас уже включен SecurityComponent. В любом случае, рад, что вы это поняли!   -  person jeremyharris    schedule 27.08.2012