声明性授权filter_access_to

时间:2010-08-10 20:14:28

标签: ruby-on-rails-3 declarative-authorization

我正在尝试使用declarative_authorization来保护Rails3控制器。

控制器具有7个RESTful操作,三个自定义成员操作(激活,停用,复制)和一个自定义集合操作(​​公共)。但是,“公共”操作只返回一条记录。

只有自定义集合操作(​​公共)才可供经过身份验证的用户使用;其余部分仅供current_user使用。

has_permission_on :foos, :to =>  :public
has_permission_on :foos, :to =>  [:full_control, :copy, :activate, :deactivate] do
  if_attribute :user => is {user}
end

privilege :full_control, :includes => [:index, :show, :new, :create, :edit, :update, :destroy]

4个自定义操作在routes.rb文件中定义:

resources :users do
  resources :foos do
    collection do 
      get :public
    end
    member do
      post :activate, :copy, :deactivate
    end
  end
end

用户:has_many Foos; A Foo:belongs_to a User。

FoosController中定义的“标准”访问控制(filter_resource_access:nested_in =>:user)似乎控制对7,RESTful操作的访问,但无法控制对其他4的访问(如预期的那样)。

当我将FooController更改为:

filter_access_to :all, :nested_in => :users, :attribute_check => true

我收到一条错误,上面写着“找不到没有ID的Foo”。

问题:

  1. 文档似乎建议a:在使用filter_access_to时,将自动调用before_filter来加载Foo模型。我错了吗?我是否需要filter_access_to的其他配置?我是否需要手动配置:before_filter?
  2. 为了我的目的,我是否还需要将use_access_control添加到模型中?当控制器中存在访问控制时,我需要在模型中添加访问控制时,我有点不清楚。
  3. 该文档描述了一个名为“create”的权限 - 它被定义为:privilege:create,:includes => :新。此外,对于:new操作,此权限是否会自动包含:create name作为其名称的结果?
  4. 如果更改了authentication_rules.rb文件,是否需要重新启动服务器才能应用新规则?

1 个答案:

答案 0 :(得分:0)

我认为过滤前的自动(如果存在)非常有限。我总是必须在过滤器之前根据上下文编写自己的。例如 - 对于索引视图,除非权限对于模型的所有实例都相同,否则您需要具有适合当前上下文的模型实例。就像查看帖子索引的用户一样,您可能希望为用户创建一个虚拟新帖子,或者加载他们的第一个但虚拟更安全,因为第一个可能不存在。通常我有一个用于索引的虚拟构造函数,其他所有东西都可以测试实际要看到(或触摸)的内容。

到目前为止控制器对我来说已经足够好了,所以模型级别肯定不是必需的。这并不是说它不会增加一些额外的安全性,但我并不擅长什么时候会变得很重要。我假设当你有一个模型被许多控制器触摸时(例如无模式控制器),你想要确保没有任何偷偷摸摸的东西。

我没有使用权限,所以我不确定,但我猜你所描述的魔法继承不会发生。创建非特定请求的权限似乎是一种非常草率的方法。

不,不需要重启 - 至少不在开发模式下。