Я пытаюсь защитить контроллер 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]
В файле rout.rb определены 4 пользовательских действия:
resources :users do
resources :foos do
collection do
get :public
end
member do
post :activate, :copy, :deactivate
end
end
end
A Пользователь: has_many Foos; Foo: принадлежит_ пользователю.
«Стандартный» контроль доступа (filter_resource_access: nested_in =>: user), как определено в FoosController, похоже, контролирует доступ к 7 действиям RESTful, но не контролирует доступ к другим 4 (как и ожидалось).
Когда я изменяю FooController на:
filter_access_to :all, :nested_in => :users, :attribute_check => true
Я получаю сообщение об ошибке «Не могу найти Foo без идентификатора».
Вопросы:
- Документация предполагает, что a: before_filter будет вызываться автоматически для загрузки модели Foo при использовании filter_access_to. Я ошибаюсь? Нужна ли дополнительная настройка filter_access_to? Нужно ли вручную настраивать: before_filter?
- Мне также нужно добавить using_access_control в модель для моих целей? Мне немного непонятно, когда нужно добавить контроль доступа к модели, когда в контроллере есть контроль доступа.
- В документации описана привилегия с именем 'create' - она определяется как: privilege: create,: includes =>: new. В дополнение к действию: new, включает ли эта привилегия автоматически действие: create вследствие его имени?
- Если файл authentication_rules.rb изменяется, нужно ли перезапускать сервер для применения новых правил?