Solución:
El componente CSRF escribe el token actual en los parámetros de solicitud como _csrfToken
, puede obtenerlo a través del objeto de solicitud param()
método (o getParam()
a partir de CakePHP 3.4):
beforeSend: function(xhr){
xhr.setRequestHeader(
'X-CSRF-Token',
<?= json_encode($this->request->param('_csrfToken')); ?>
);
},
Para que el token esté disponible para todos sus scripts, puede, por ejemplo, hacer que esté disponible globalmente como variable en su plantilla de diseño:
<script>
var csrfToken = <?= json_encode($this->request->param('_csrfToken')) ?>;
// ...
<script>
Luego puede usarlo fácilmente en todas sus solicitudes AJAX:
setRequestHeader('X-CSRF-Token', csrfToken);
El componente CSRF se puede desactivar eliminándolo del administrador de eventos de los controladores. Tendrá que averiguar qué condición necesitaría para hacer eso, por ejemplo, para una acción específica, como esta:
public function beforeFilter(CakeEventEvent $event)
{
parent::beforeFilter($event);
if ($this->request->param('action') === 'actionXyz') {
$this->eventManager()->off($this->Csrf);
}
}
Si está utilizando el middleware CSRF, el token todavía está disponible como un parámetro de solicitud llamado _csrfToken
, deshabilitar el middleware, sin embargo, funciona de manera diferente, ver por ejemplo Cakephp 3.5.6 deshabilita el middleware CSRF para el controlador
Ver también
- Libro de recetas> Objetos de solicitud y respuesta> Parámetros de solicitud
- Libro de recetas> Controladores> Componentes> CSRF> Uso del componente Csrf
- Libro de recetas> Controladores> Componentes> CSRF> Deshabilitar el componente CSRF para acciones específicas
Cada forma tiene un oculto _csrfToken
campo que se agrega automáticamente cuando ha habilitado el componente Csrf. Ahora puede obtener fácilmente el token de este campo mediante jquery como $('[name="_csrfToken"]').val()
.
Una llamada ajax se verá así:
$.ajax({
url: 'someUrl',
headers : {
'X-CSRF-Token': $('[name="_csrfToken"]').val()
},
type: 'post',
...
});