如何使用angularjs $ post service和symfony2发送有效的csrf标记

时间:2015-01-28 13:28:42

标签: ajax symfony-forms angularjs-service csrf-protection angular-http

我想我已经阅读了足够的主题来发布这个问题......我真的想知道为什么我使用ajax的提交无效(CSRF令牌无效。请尝试重新提交表单)。

这是我发送表单数据和csrf令牌的方式。

<form name="ReviewForm" ng-init="formData = { url: '{{ path('my_route') }}', token: '{{ csrf_token('review') }}' } ng-submit="sendReview(ReviewForm.$valid)" other parameters... >

在我的角度控制器中:

myAppcontroller('FormManagerCtrl', ['$scope', '$http', function ($scope, $http) {
    $scope.formData = {};
    $scope.sendReview = function (isValid) {
        if (isValid) {
            $http.post($scope.formData.url, $.param({
                    'review[pseudo]': $scope.formData.pseudo,
                    'review[email]': $scope.formData.email,
                    'review[title]': $scope.formData.title,
                    'review[website]': $scope.formData.website,
                    'review[rate]': $scope.formData.rate,
                    'review[content]': $scope.formData.content,
                    '_csrf_token': $scope.formData.token
            }), {
                    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                })
                .success(function (data, status, headers, config) {
                    console.log('ok');
                })
                .error(function (data, status) {
                    console.log('ko');
                });
        }

    };
}]);

我的表单名称是“review”。

// Form type class
public function getName()
{
    return 'review';
}

我尝试了不同的名字(_token等...),我检查了{{ form_widget(form._token) }}csrf_token('review')是否返回了相同的值但没有成功。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在symfony2中形成元素idname属性由getName() + field name组成,在您的情况下,令牌将具有id="review__token"和{ {1}},因此,框架将检查帖子数据中是否存在name="review[_token]"。我认为您需要更改review[_token]的{​​{1}}参数,就像其他参数一样。