ruby-on-rails – Rails:用户使用:remote => true销毁不相关的对象后注销

ruby-on-rails – Rails:用户使用:remote => true销毁不相关的对象后注销,第1张

概述我正在关注 http://railscasts.com/episodes/250-authentication-from-scratch进行简单的身份验证.它按预期工作.我的应用程序中有一个模型,其中包含以下部分: <%= content_tag_for(:li, post) do %> <%= link_to 'Delete', post, :confirm => 'Are you sure 我正在关注 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 => [:破坏]@H_404_44@>更安全的解决方案是使用AJAX调用提交CSRF令牌.我认为如果您将远程链接更改为button_to,这将自动发生.阅读更多here.

<%= button_to'删除',发布,:confirm => “你确定吗?”,:method => :delete,:remote => true%>>您还可以使用cookie来存储current_user而不是会话.这对安全性的影响取决于您的应用程序的详细信息.

总结

以上是内存溢出为你收集整理的ruby-on-rails – Rails:用户使用:remote => true销毁不相关的对象后注销全部内容,希望文章能够帮你解决ruby-on-rails – Rails:用户使用:remote => true销毁不相关的对象后注销所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1279079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存