【问题标题】:Rails : User logged out after destroying an unrelated object with :remote => trueRails:用户在使用 :remote => true 销毁不相关的对象后注销
【发布时间】:2012-08-29 05:08:10
【问题描述】:

我正在关注http://railscasts.com/episodes/250-authentication-from-scratch 进行简单的身份验证。它按预期工作。我的应用中有一个模型,带有以下 partial

<%= 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();

单击delete 按钮时,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

任何线索为什么会出现这种行为?

而且,如果我从delete 链接中删除:remote =&gt; true,则用户仍处于登录状态。我在destroy 方法中有session 的日志语句在任何一种情况下都不会被调用,但如果':remote=&gt;true 然后会话以某种方式搞砸了。在检查 cookie 时,我发现 cookie 没有被破坏,但是当调用 posts 上的 destroy 方法时它确实被修改了。不知道为什么会发生这种情况。

【问题讨论】:

    标签: ruby-on-rails ruby ajax authentication railscasts


    【解决方案1】:

    听起来您遇到了旨在防止Cross Site Request Forgery 的rails 安全功能。添加:remote =&gt; true 会导致请求通过没有CSRF 安全令牌的ajax 提交,因此rails 破坏会话,因为它认为这是CSRF 攻击。要解决这个问题,您有几个选择:

    1. 一种快速而肮脏(且不安全)的解决方案是关闭对该请求的安全检查。为此,请将此行添加到控制器的顶部:

      skip_before_filter :verify_authenticity_token, :only =&gt; [:destroy]

    2. 更安全的解决方案是通过 AJAX 调用提交 CSRF 令牌。我认为如果您将远程链接更改为button_to,这将自动发生。阅读更多here

      &lt;%= button_to 'Delete', post, :confirm =&gt; 'Are you sure?', :method =&gt; :delete, :remote =&gt; true %&gt;

    3. 您还可以使用 cookie 来存储 current_user 而不是会话。这对安全性的影响将取决于您应用的详细信息。

    【讨论】:

    • Rails 3.0.9 中 link_to_remote 方法是否未定义?我试着做&lt;%= link_to_remote 'Delete', :url=&gt;url_for(post), :method =&gt; :delete, :confirm =&gt; 'Are you sure?' %&gt;
    • 选项 #1 和 3 在当前情况下是不可能的,但很高兴知道!而且,button_to 也很好用..
    • 好像link_to_remote 被贬值了。我已将其从我的答案中删除。
    • 但是很难相信这不能通过链接实现。
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多