Унаследованные ресурсы и CanCan 3 уровня вложенности

У меня проблема с 3 уровнями вложенности моделей в CanCan в сочетании с Inherited Resources. Я читал, что мы должны вкладывать все до 2 уровней, но мне пришлось поместить все в модель account, и теперь я попытался сделать это в CanCan:

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project

Это дает мне переменную @account со значением @project, как будто она перезаписывает это. @project — это то, что должно быть, и @model тоже. Это моя вина, CanCan, унаследованные ресурсы или CanCan просто не поддерживает 3 уровня вложенности? Кроме того, я делаю это в IR для ModelsController.

belongs_to :account, :finder => :find_by_name! do
  belongs_to :project, :finder => :find_by_name!
end

Еще одна странность, когда я удаляю часть load_and_ из определения CanCan. Тогда это работает, но я читал, что не использовать часть load может быть опасно.

Могу ли я использовать только authorize_resource или мне нужно что-то сделать с CanCan?


person farnoy    schedule 22.03.2011    source источник
comment
Я понятия не имею, сколько уровней поддерживает CanCan, но вы можете выполнить загрузку самостоятельно, а затем вместо этого вызвать только метод authorize_resource. github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions   -  person jdl    schedule 22.03.2011
comment
Вы можете использовать authorize_resource, просто убедитесь, что вы используете свой фильтр before_filter для загрузки перед authorize_resource.   -  person dombesz    schedule 23.03.2011


Ответы (1)


Насколько я могу судить, ваши полномочия были правильными.

Разработчик жемчужины CanCan Райан опубликовал, как это должно работать: https://github.com/ryanb/cancan/issues/127#issuecomment-364475

Это означает, что ваш

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project

закончит в блоке, подобном этому (здесь: создать действие. Для других действий должна последняя авторизация! и изменение @model):

@account = Account.find(params[:account_id])
authorize! :read, @account
@project = @account.projects.find(params[:project_id])
authorize! :read, @project
@model = @project.models.build
authorize! :new, @model

Я надеюсь, что этот ответ может помочь разработчикам, которые ищут вложенную авторизацию канкана :-).

источник: https://github.com/ryanb/cancan/issues/127#issuecomment-364475


PS: неправильное поведение для /accounts/1/projects/2/models/new:

load_and_authorize_resource :project
load_and_authorize_resource :model, :through => :project

Это своего рода проблема безопасности, потому что это будет делать

@project = Project.find(params[:project_id]) [...]

, и не проверяет, разрешено ли текущей учетной записи читать связанную учетную запись «1». И не проверяет, действительно ли проект «2» является проектом аккаунта «1».

person Adreamus    schedule 18.06.2013