Ceci est une ancienne révision du document !
CakePHP : 1.3.x
Le SecurityComponent est un composant bien utile de CakePHP permettant entre autre de sécuriser des formulaires: utilisé avec le FormHelper, il est responsable entre autre de:
En cas d'erreur de ces comparaisons, par défaut le SecurityComponent affiche une page vide avec un code d'erreur HTTP.
Lors du développement, il peut alors être difficile de déterminer pour quelle raison un formulaire se bloque lors de l'envoi. Mais la plupart du temps la raison est que la comparaison des champs affichés par le FormHelper et les champs renvoyés (et donc vérifiés par le SecurityComponent) ne correspondent pas.
Comment comparer les champs affichés par le FormHelper et les champs renvoyés ?
SecurityComponent
Mettre un point d'arrêt de debug à la fin de la méthode _validatePost(&$controller) pour comparer les variables $token et $check
... $check = Security::hash(serialize($fieldList) . Configure::read('Security.salt')); return ($token === $check); }
Si les valeurs de $token et $check sont différentes, on est bien dans le cas d'une différence entre champs affichés et champs renvoyés
Dans ce cas:
FormHelper
Mettre un point d'arrêt dans la méthode secure($fields = array()). Cette méthode est appelée par la méthode end($options = null) de FormHelper. Ce point d'arrêt permet de déterminer quels sont les champs affichés du formulaire (variable $fields en début de méthode) et le hash qui en découle (variable $fields en fin de méthode).
function secure($fields = array()) { if (!isset($this->params['_Token']) || empty($this->params['_Token'])) { return; } ... $fields = Security::hash(serialize($fields) . Configure::read('Security.salt')); ... return $out; }
Réutiliser le point d'arrêt mis dans SecurityComponent afin de voir le contenu de $fieldList qui devrait être différent du contenu de $fields dans FormHelper.
A partir de là, il ne restera plus qu'à savoir d'où vient cette différence !