Вложени нива на наследени ресурси и CanCan 3

Имам проблем с 3 нива на влагане на модели в CanCan, комбинирани с наследени ресурси. Четох, че трябва да вложим всичко до 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, 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?


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 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

Надявам се, че този отговор може да помогне на разработчиците, които търсят вложено разрешение за канкан :-) .

източник: 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