0

我刚刚添加并配置了设计 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 过滤器:

before_filter :authenticate_user!, except: :autosave

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

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

4

1 回答 1

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 安全令牌。请参阅 Devise not setting current_user on Ajax post 即使正确的 x-csrf-token 包含在请求标头中,以获取使用安全令牌的示例 AJAX 请求。此外,请确保您还包含<%= csrf_meta_tag %>在您的头部标签中。

于 2012-11-08T17:37:58.267 回答