Итак, у меня есть таблица, которая автоматически генерируется с использованием DataTables. Действие в моем CakePHP хватает данных для этой таблицы и форматы его в формат JSON для DataTables, чтобы использовать это отформатированный JSON:Отключение CSRF для определенного действия CakePHP 3
<?php
$data = array();
if (!empty($results)) {
foreach ($results as $result) {
$data[] = [
'name' => $result->name,
'cad' => $this->Number->currency($result->CAD, 'USD'),
'usd' => $this->Number->currency($result->USD, 'USD'),
'edit' => '<a href="' .
$this->Url->build(['controller' => 'Portfolios', 'action' => 'edit', $result->id]) .
'"><i class="fa fa-pencil"></i></a>',
'delete' => '<input type="checkbox" class="delete" value="' . $result->id . '">'
];
}
}
echo json_encode(compact('data'));
Как вы можете видеть, у меня есть вариант «удалить» в там выводит флажок со значением идентификатора соответствующего элемента. Когда этот флажок установлен, кнопка удаления показывает, который отправляет этот запрос Ajax:
$('a#delete').on('click', function(e) {
e.preventDefault();
var checkedValues = [];
$('input.delete:checked').each(function() {
checkedValues.push($(this).val());
});
$.ajax({
url: $(this).attr('href'),
type: 'POST',
data: checkedValues
});
})
Это Аякс пост идет к моему действию контроллера удаления(). Проблема, с которой я сталкиваюсь, заключается в том, что я получаю сообщение об ошибке «Недопустимый токен Csrf». Я знаю, почему это происходит, я представляю форму с защитой Csrf, у которой не добавлен токен Csrf.
Не могу понять, как вручную создать токен Csrf для этой ситуации (где вводимые значения генерируются после загрузки страницы). Я также не могу понять, как отключить защиту Csrf. Я читал this, но код помещается в функцию beforeFilter, и, насколько я понимаю, это означает, что он запускается для каждого действия, а не только для этого, и это не то, что я хочу. Плюс, чтобы быть абсолютно честным, я предпочел бы решение, где я не дезактивирую функции безопасности.
Есть ли способ отключить Csrf для этого конкретного действия или есть лучший способ сделать это?
Я попытался это, но это Безразлично» т работы. Это отключает безопасность для действия, а не Csrf, которые являются двумя отдельными компонентами. –
моя ошибка, я слишком быстро прочитал ваш вопрос :) Я отредактировал свой ответ –
Как я уже сказал, и связанный в моем вопросе, я уже читал это. Но, насколько я понимаю, это отключает Csrf в каждом действии в контроллере, поскольку он запускается в методе BeforeFilter. –