加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:用户使用:remote => true销毁不相

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读