我使用JQuery AJAX发送DELETE HTTP请求。 URL(/ myitems / 1234)与注销URL(/ users / sign_out)不同,但在请求后我发现用户会话已被破坏。
我正在使用Devise身份验证gem。
这是日志:
Started DELETE "/myitems/2538" for 127.0.0.1 at 2012-06-26 19:09:49 +0400
Processing by MyItemsController#destroy as */*
Parameters: {"id"=>"2538"}
WARNING: Can't verify CSRF token authenticity
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 6 LIMIT 1
(0.0ms) BEGIN
(0.0ms) UPDATE "users" SET "remember_token" = NULL,
"remember_created_at" = NULL,
"updated_at" = '2012-06-26 15:09:49.055774'
WHERE "users"."id" = 6
(1.0ms) COMMIT
Completed 401 Unauthorized in 7ms
routes.rb包含一行:
resources :myitems
并没有更多关于myitems。
控制器的删除代码:
def destroy
puts 'delete'
end
更新
POST请求也是如此。
答案 0 :(得分:2)
问题(正如@Thilo的评论中暗示的那样)是您的AJAX请求不包含CSRF令牌。如果CSRF令牌不匹配,Rails的默认行为是清除会话。这就是您的会话被删除的原因。
解决方案:
1)在您的AJAX请求中传递CSRF令牌。根据您的需要,您可以利用Rails的UJS代码自动添加适当的CSRF标题。
2)跳过特定控制器操作的真实性令牌验证,尽管这可能会产生负面的安全隐患。
我将此标记为社区维基,以便其他人可以改进,因为我现在没有时间。