Rails,我可以按格式指定控制器过滤器吗?

时间:2010-09-03 04:40:19

标签: ruby-on-rails rest

我在RESTful Rails应用程序控制器中发现了一个常见问题,它可以响应多种格式(HTML,XML等)。问题是,对于任何给定的方法(INDEX,CREATE,NEW,EDIT,SHOW,UPDATE或DESTROY),我想限制对1种格式的管理员用户的访问,而不是其他方式。当然我已经有了“ before_filter:admin_required ”,但除非给定方法的所有格式都遵循相同的权限(很多时候不是这种情况),否则它是无用的。我最终只需要打开整个方法,然后在需要保护的任何格式中添加“ head:bad_request,除非current_user.is_admin ”。这有效,但由于某些原因我觉得不对。看起来我应该能够以某种方式在before_filter上添加一个格式参数,以便保持整洁。你们是怎么做到的?为什么?

更新的问题:

我认为人们并不完全了解我的情况,所以让我试着重新解释一下。首先,只要知道这对我来说已经有用并且是安全的,我对此没有任何问题。所以基本上,我已经确定HTML页面仅供管理员创建/更新/编辑/删除对象。普通用户只能通过Flash通过XML与应用程序进行交互。这意味着每个动作基本上有两种不同的执行路径(每种路径都有自己独特的代码/逻辑等)。因此,当请求进入时,格式决定了采用哪条路径。每个都有检查以确保不允许恶意请求,并且在这些情况下返回head:bad_request。没有办法“在flash之外制作XML请求”,并以某种方式让应用程序做一些不应该做的事情。如果XML请求来自Flash,应用程序可能会更少关注。一点都没关系。唯一重要的是请求是否有效,具体取决于用户的凭据和发布的属性 - 而不是来自何处。无论如何,这一切都很有效,唯一的缺点是我的很多行为通常只有“ before_filter:admin_required ”不能再使用了。它们本质上需要向所有人开放,然后我必须在需要它的某些动作/格式组合上手动执行“ head:bad_request,除非current_user.is_admin ”。我只是希望能够对控制器中的过滤器进行更细粒度的控制,以便我可以执行类似“ before_filter:admin_required,:format => html

的操作。

2 个答案:

答案 0 :(得分:1)

我不确定是否完全理解你,但你可以访问before_filter中的format参数,例如:

before_filter :admin_required

...

private
def admin_required
  return nil unless params[:format]

  case params[:format].to_sym
  when :xml
    head :bad_request unless current_user.is_admin
  end
end

正如@jdl所提到的,听起来这可能是一个安全漏洞。通常你会使用不同的格式渲染相同的对象,这意味着攻击者只会查看不同的格式来查看所有信息。

如果你希望每个人都能看到html,我可以看到它可能有意义,但只有管理员才能看到xml,但是用户可以通过屏幕抓取页面来获得相同的信息。

在您的情况下,攻击者可以使用网络跟踪来监视Flash应用程序发送的xml请求,然后根据该请求制作自己的请求。我认为你很难确定请求是否真的来自闪存,或者它是否被欺骗。这个可能对您来说不是问题,因为您的html页面当然总是受到保护,但我认为您必须假设任何人都可以看到XML版本。

答案 1 :(得分:1)

我认为我有更好的方法来解决这个问题。首先,获取Rails 3.然后,您可以通过路由上的格式进行限制。将它与命名空间相结合,您就可以以更清洁的方式实现我想要做的事情。