Унаследованные ресурсы и вложенность уровней CanCan 3 - PullRequest
3 голосов
/ 22 марта 2011

У меня проблема с вложением трехуровневых моделей в CanCan в сочетании с Inherited Resources. Я читал, что мы должны вкладывать все до двух уровней, но мне пришлось поместить все под модель 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's, Inherited Resources или просто 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?

1 Ответ

2 голосов
/ 18 июня 2013

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

Разработчик CanCan gem ryan написал, как это должно вести себя: 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

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

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


ps: неправильное поведение для / account / 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».

...