2015-06-24 3 views
1

Итак, у меня есть таблица, которая автоматически генерируется с использованием 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 для этого конкретного действия или есть лучший способ сделать это?

ответ

5

прочитать все о компоненте CSRF здесь

http://book.cakephp.org/3.0/en/controllers/components/csrf.html

можно отключить для определенного действия здесь:

http://book.cakephp.org/3.0/en/controllers/components/csrf.html#disabling-the-csrf-component-for-specific-actions

public function beforeFilter(Event $event) { 
    if (in_array($this->request->action, ['actions_you want to disable'])) { 
     $this->eventManager()->off($this->Csrf); 
    } 
} 
+0

Я попытался это, но это Безразлично» т работы. Это отключает безопасность для действия, а не Csrf, которые являются двумя отдельными компонентами. –

+0

моя ошибка, я слишком быстро прочитал ваш вопрос :) Я отредактировал свой ответ –

+0

Как я уже сказал, и связанный в моем вопросе, я уже читал это. Но, насколько я понимаю, это отключает Csrf в каждом действии в контроллере, поскольку он запускается в методе BeforeFilter. –

Смежные вопросы