我正在尝试使用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”。
问题:
答案 0 :(得分:0)
我认为过滤前的自动(如果存在)非常有限。我总是必须在过滤器之前根据上下文编写自己的。例如 - 对于索引视图,除非权限对于模型的所有实例都相同,否则您需要具有适合当前上下文的模型实例。就像查看帖子索引的用户一样,您可能希望为用户创建一个虚拟新帖子,或者加载他们的第一个但虚拟更安全,因为第一个可能不存在。通常我有一个用于索引的虚拟构造函数,其他所有东西都可以测试实际要看到(或触摸)的内容。
到目前为止控制器对我来说已经足够好了,所以模型级别肯定不是必需的。这并不是说它不会增加一些额外的安全性,但我并不擅长什么时候会变得很重要。我假设当你有一个模型被许多控制器触摸时(例如无模式控制器),你想要确保没有任何偷偷摸摸的东西。
我没有使用权限,所以我不确定,但我猜你所描述的魔法继承不会发生。创建非特定请求的权限似乎是一种非常草率的方法。
不,不需要重启 - 至少不在开发模式下。