【问题标题】:Allow AJAX Through Devise (Rails)通过设计允许 AJAX (Rails)
【发布时间】:2012-11-08 16:52:20
【问题描述】:

我刚刚添加并配置了设计 gem。除了阻止我的表单的自动保存 AJAX 调用之外,它工作得很好。

在我的控制器顶部,我有:

before_filter :authenticate_user!

我的 AJAX 调用来自同一个控制器:

  def autosave
    #TODO: update relative entry
    #TODO: verify user logged in
    #TODO: verify entry belongs to relative user
    render content_type: 'text/xml', inline: "<result status='ok' />"
  end

当然,我可以像这样声明我的前置过滤器:

before_filter :authenticate_user!, except: :autosave

..但这并不能阻止任何人随时调用此控制器函数。

允许调用此函数的最佳方法是什么?我仍然想确保只有登录用户才能拨打电话,并且他们正在编辑的给定记录属于他们。

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-3 devise ruby-on-rails-plugins


    【解决方案1】:

    不完全确定您要做什么,但听起来您只需要在自动保存中添加一些逻辑即可。使用此设置,该函数本身仍将被调用,但除非条件正确,否则它是否执行任何操作完全是另一回事。

    def autosave
      #Verify that the user is signed in and he has ownership of entry
      if !current_user.nil? && entry.user == current_user
        render content_type: 'text/xml', inline: "<result status='ok' />"
      else
        #do nothing nothing or redirect with error here
      end  
    end
    

    由于您要发布 AJAX 帖子,因此您必须为您的 ajax 调用提供一些附加信息作为安全对策,即 CSRF 安全令牌。有关使用安全令牌的示例 AJAX 请求,请参阅 Devise not setting current_user on Ajax post even though correct x-csrf-token is included in request header。此外,请确保您的 head 标签中还包含&lt;%= csrf_meta_tag %&gt;

    【讨论】:

    • 由于调用来自 AJAX(确切地说是 CKEDITOR 形式)而不是来自 Rails 链接,它看起来像 current_user.nil?将始终返回 true。我必须传递一个特定的参数吗?
    • current_user 究竟返回了什么?
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多