2015-07-25 3 views
1

Я пытаюсь изменить подход к шаблонам рендеринга. Я использовал серверный механизм шаблонов. Теперь, когда мне нужно вернуть только JSON из бэкэнд вместо HTML, мне нужно перенести шаблоны на интерфейс.Сериализация данных FormView в JSON

Проблема для меня, как новичок, это когда шаблон содержит форму. Другими словами, когда конечный JSON также должен содержать токен csrf. Пожалуйста, возьмите пример приложения CRUD для книг (один объект Book(id_book, name)). Шаблон для записи Read показывает имя книги и позволяет удалить книгу.

В контроллере Symfony2 я использую метод createFormBuilder(), который создает объект формы удаления, к которому применяется метод createView(). Объект, возвращаемый последним, используется form_widget() в движке шаблонов (Twig). В конце:

<div id="bookName">{{book.name}}</div> 
<div id="bookDelete"> 
     <form action="{{ path('book_delete', { 'id': book.id }) }}" method="post"> 
      <input type="hidden" name="_method" value="DELETE" /> 
      {{ form_widget(delete_form) }} 
      <button type="submit"></button> 
     </form> 
</div> 

который будет возвращать:

<div id="bookName">Symfony2 In Depth</div> 
<div id="bookDelete"> 
    <form action="/web/app_dev.php/deletes" method="post"> 
     <input type="hidden" name="_method" value="DELETE"> 
     <div id="form"> 
      <input type="hidden" id="form_id" name="form[id]" value="15"> 
      <input type="hidden" id="form__token" name="form[_token]" value="dd6573ae916ae30f78ba35a8c67e5d42a2764c1c"> 
     </div> 
     <button type="submit"></button> 
    </form> 

Что я представляю при перемещении рендеринга шаблона на передний конец является окончательной JSON от сервера выглядит как:

{ 
'id':15, 
'name': 'Symfony2 in Depth', 
'csrf_token' : 'dd6573ae916ae30f78ba35a8c67e5d42a2764c1c'  
} 

Вопросы как реализовать тот же внутренний механизм Symfony2 для рендеринга токена csrf для формы DELETE, как часть окончательного JSON для чтения объекта книги? Можно ли избавиться от {{ form_widget(delete_form) }} и всех его длинных объектов и только сериализовать токен csrf с именем книги? На что это повлияет? Я чувствую, что это хорошо для производительности, но как?

Ваше обычное руководство очень ценится.

ответ

2

Вы можете создать вы прут файл что-то вроде:

{ 
    'id': '{{ form.id.vars.value }}' 
    'name': '{{ form.name.vars.value }}' 
    'csrf_token': '{{ form._token.vars.value }}' 
} 

Во всяком случае я не рекомендую использовать CSRF токен при использовании API, то лучше, если вас отключен. Если вы хотите отключить для всех приложений в config.yml:

framework: 
    csrf_protection: 
     enabled:  false 

Или только для одной формы в виде Тип оных:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'csrf_protection' => false, 
    )); 
} 
+0

Ну, как я могу предотвратить от уязвимости при отключении csrf_token ? исключение книги - это что-то важное, и вредоносные пользователи не могут удалять. В любом случае, спасибо за рекомендацию мне удалить токен из API, это хорошая идея, так как токен csrf остается одним и тем же для одного пользователя во время его сеанса, поэтому я поместил его в переменную javascript в первый рендер и буду использовать его дальше. Любые замечания по этому поводу? –

+0

Я имею в виду, что у вас есть внутренний API или открытый API. Если вы разрабатываете публичный api, этого не имеет, и если у вас есть внутренний API и вы используете OAuth для аутентификации, токен пользователя позволяет вам предотвратить эту уязвимость, вы меня понимаете? –

+0

Tnx Alfonso для вашего времени. Я думаю, что одновременно создаю внутренний и общедоступный API (это общедоступный веб-сайт для контента, созданного частными аутентифицированными пользователями, то есть CRUD-приложение, где аутентификация выполняется через форму входа). Относительно того факта, что мое приложение может быть освобождено csrf, я прочитал в SO разные мнения, которые я не полностью понимаю (например, http://stackoverflow.com/questions/7600347/rails-api-design-without-disabling-csrf-protection) ... –

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