ruby-on-rails – Rails:用户使用:remote => true销毁不相
我正在关注
http://railscasts.com/episodes/250-authentication-from-scratch进行简单的身份验证.它按预期工作.我的应用程序中有一个模型,其中包含以下部分:
<%= content_tag_for(:li,post) do %> <%= link_to 'Delete',post,:confirm => 'Are you sure?',:method => :delete,:remote => true %> <% end %> 它在index.html.erb中调用如下: <%= render :partial => @posts.reverse %> destroy.js.erb如下所示,如果对象被成功销毁则调用它. $('#<%= dom_id(@post) %>').css('background','red'); $('#<%= dom_id(@post) %>').hide(); 单击删除按钮后,post对象将被正确删除,destroy.js.erb也会正确呈现.但不知何故,用户退出了.以下是我的posts_controller.rb的代码: def destroy logger.error 'in destroy' @post = Job.find(params[:id]) @post.destroy respond_to do |format| format.html { redirect_to(posts_url) } format.xml { head :ok } format.js end end 任何线索为什么会出现这种行为? 并且,如果我删除:remote =>从删除链接中返回true,然后用户仍然登录.我在会话的destroy方法中有日志语句,在任何一种情况下都不会被调用,但如果’:remote =>为true,那么会话就会被搞砸了.在检查cookie时,我发现cookie没有被销毁但是当调用post上的destroy方法时它会被修改.不知道为什么会发生这种情况. 解决方法
听起来你正在碰撞铁轨安全功能,以防止
Cross Site Request Forgery.添加:remote => true导致请求通过ajax提交而没有CSRF安全令牌,因此rails会破坏会话,因为它认为它是CSRF攻击.要解决这个问题,您可以选择以下几种方法:
>快速而肮脏(且不安全)的解决方案是关闭该请求的安全检查.为此,请将此行添加到控制器的顶部: skip_before_filter:verify_authenticity_token,:only => [:破坏] <%= button_to'删除',发布,:confirm => “你确定吗?”,:method => :delete,:remote => true%>>您还可以使用cookie来存储current_user而不是会话.这对安全性的影响取决于您的应用程序的详细信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |