Rails会话在DELETE请求时被破坏[重复]
Posted
技术标签:
【中文标题】Rails会话在DELETE请求时被破坏[重复]【英文标题】:Rails session gets destroyed on DELETE request [duplicate] 【发布时间】:2012-06-27 22:46:12 【问题描述】:可能重复:WARNING: Can't verify CSRF token authenticity rails
我使用 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 请求也是如此。
【问题讨论】:
请为删除方法显示您的控制器代码。 见***.com/questions/7203304/… 【参考方案1】:问题(正如@Thilo 的评论所暗示的)是您的 AJAX 请求不包含 CSRF 令牌。如果 CSRF 令牌不匹配,Rails 的默认行为是清除会话。这就是您的会话被删除的原因。
解决方案:
1) 在您的 AJAX 请求中传递 CSRF 令牌。根据您的需要,您可以利用 Rails 的 UJS 代码自动添加适当的 CSRF 标头。
2) 跳过特定控制器操作的真实性令牌验证,尽管这可能会产生负面的安全影响。
我将其标记为社区 wiki,以便其他人可以对其进行改进,因为我现在没有时间。
【讨论】:
以上是关于Rails会话在DELETE请求时被破坏[重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Rails 中使用 Devise 销毁会话 [重复]