2013-11-26 6 views
0

БЫСТРОГО ПРЕДПОСЫЛКИРельсы 3: CSRF с form_tag

У меня есть модель, где facility HAS_MANY managers через relationships. Модель отношения содержит один дополнительный атрибут: admin, который является булевым. Затем для каждого объекта у меня есть страница, которая позволяет администратору/некоторому пользователю пометить managers как admin или нет. Они делают это через флажки. Я использую программу для менеджеров. Все довольно много сделано, как первые 2 минуты этого railscast:

http://railscasts.com/episodes/165-edit-multiple-revised?view=comments

ПРОБЛЕМА (S)

Вопрос в том, когда я представляю form_tag, я получаю:

1. ПРЕДУПРЕЖДЕНИЕ: не удается проверить подлинность CSRF токен

2. Затем он сбрасывает мой сеанс пользователя (меня выводит из строя), поэтому мне нужно снова войти в систему, чтобы продолжить работу.

Если я удалю protect from forgery с контроллера приложения, все работает плавно, но, очевидно, я не хочу это делать как свое исправление.

Итак, как я могу избежать этой проблемы CSFR с помощью form_tag?

ФОРМА (обновлена)

<%= form_tag admin_relationships_path, method: :put do %> 
    <table> 
    <tr> 
    <th></th> 
    <th>Person Name</th> 
    <th>Admin</th> 
    </tr> 

<% @relationships.each do |relationship| %> 
    <tr> 
    <td><%= check_box_tag "relationship_ids[]", relationship.id %></td> 
    **<%= hidden_field_tag :authenticity_token, form_authenticity_token %>**   
    <td><%= User.find(relationship.user_id).full_name %></td> 
    <td><%= relationship.admin ? "Yes" : "No" %></td> 

    <td><%= link_to 'Remove', relationship, method: :delete, **remote: true** %></td> 

    </tr> 
<% end %> 
    </table> 

    <%= submit_tag "Make Checked Admins" %> 
<% end %> 

Контроллер илит.

class RelationshipsController < ApplicationController 

    def destroy 
    @relationship = Relationship.find(params[:id]) 
    @relationship.destroy 

    respond_to do |format| 
     format.html { redirect_to "/facilities/1679/invite", notice: " Manager has been deleted." } 
     format.json { head :no_content } 
    end 
end 

Журнал.

Started DELETE "/relationships/52" for 127.0.0.1 at 2013-11-26 14:30:11 -0500 
Processing by RelationshipsController#destroy as JS 
Parameters: {"id"=>"52"} 
WARNING: Can't verify CSRF token authenticity 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 38 LIMIT 1 
    (0.1ms) BEGIN 
    (0.1ms) COMMIT 
Relationship Load (0.2ms) SELECT `relationships`.* FROM `relationships` WHERE `relationships`.`id` = 52 LIMIT 1 
    (0.1ms) BEGIN 
SQL (0.2ms) DELETE FROM `relationships` WHERE `relationships`.`id` = 52 
    (0.4ms) COMMIT 
Redirected to http://localhost:3000/facilities/1679/invite 
Completed 302 Found in 10ms (ActiveRecord: 1.6ms) 


Started DELETE "/facilities/1679/invite" for 127.0.0.1 at 2013-11-26 14:30:11 -0500 

ActionController::RoutingError (No route matches [DELETE] "/facilities/1679/invite"): 

Заголовки запросов:

Accept, Accept-Encoding, Accept-Language, Connection, Cookie, Host, Origin, Referer, User-Agent, X-Requested-With

ОТВЕТ

Как плакат Бела ow, мой токен CSFR не был получен на странице. Хотя, у меня был <%= csrf_meta_tag %> в моем макете приложения и макете администратора, и я фактически отображал макет приложения, форма находилась на странице Devise.

Так что мне нужно было установить код <%= csrf_meta_tag %> в devise.html.erb. Ниже приведен поиск неисправностей.

ответ

3

Попробуйте добавить это aplication.js:

$.ajaxSetup({ 
    headers: { 
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

Ответил здесь: WARNING: Can't verify CSRF token authenticity rails

+0

Все еще не работает, мне нужно также добавить метод отправки? И просто, чтобы заявить об этом, я каждый раз перезапускаю сервер. – miler350

+0

Нет, это либо или. Какую версию Rails вы используете? Если вы в 3.1 попробуете этот ответ: http://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails#answer-8798687 – DiegoSalazar

+0

Я не знаю, в чем проблема. , Это тоже не работает. Приложение использует 3.2.11. – miler350

2

Убедитесь, что вы либо это в макете приложения в головной секции:

<%= csrf_meta_tag %> 

Или это скрытое поле в форме:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 
+0

'<% = hidden_field_tag: authenticity_token, form_authenticity_token%>' сделал трюк. Благодарю. – miler350

+0

csrf_meta_tag используется для запросов Ajax. Если вы используете помощник формы Rails, он должен автоматически добавить поле authenticity_token. –

+0

На самом деле, возможно, я принял слишком быстро. Эти решения работают для действия администратора, но не для действия удаления. – miler350

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