Возможности Cancan для унаследованных ресурсов с вложением в контроллер - PullRequest
0 голосов
/ 17 ноября 2011

Я унаследовал ресурсы, работающие в моих контроллерах, и я использую cancan для авторизации.Тем не менее, у меня проблема с написанием необходимых способностей.

Я могу отобразить конкретный порядок двумя способами:

/profile/123/orders/321
/store/456/orders/321

в контроллере:

class OrdersController < ApplicationController
  inherit_resources 
  belongs_to :profile, :store, :optional => true
  load_and_authorize_resource
  ...
end

Роли: пользователь(has_one: профиль в модели) и менеджер (has_one: store в модели)

Требования (в словах):

  • Менеджер может отображать заказы в контексте (принадлежит своему магазину.
  • Менеджер не может отображать заказы в контексте любого профиля пользователя (доступ должен быть запрещен)
  • Пользователь может отображать заказы в контексте своего профиля
  • Пользователь не может отображать заказ (ы) в контексте какого-либо магазина (отказано)

Я не мог выполнить эти требования, возможно, я должен загрузить ресурс особым образом или фактически в 2пути?Интуиция говорит мне, что доступ к заказам должен быть основан на доступе к родительскому ресурсу в обоих случаях.Спасибо за помощь.

1 Ответ

0 голосов
/ 03 января 2012

Если у вас есть права в профиле и хранилище для вашего файла powers.rb, то вы также можете просто авторизовать родителя.Т.е. что-то вроде этого:

load_and_authorize_resource :profile
load_and_authorize_resource :store
load_and_authorize_resource :order

Или вы можете сделать так, как описано в CanCan wiki:

Полиморфные ассоциации

Допустим, задачи могут либобыть назначенным на Проект или Событие через полиморфную ассоциацию.Массив может быть передан в параметр: through, и он будет использовать первый найденный файл.

 load_resource :project
 load_resource :event
 load_and_authorize_resource :task, :through => [:project, :event]

Здесь он будет проверять переменные @project и @event и извлекать задачу через любую существующую.Обратите внимание, что это только загрузка родительской модели, если вы хотите авторизовать родительский объект, вам нужно будет сделать это через before_filter, потому что здесь задействована специальная логика.

 before_filter :authorize_parent
 private
 def authorize_parent
   authorize! :read, (@event || @project)
 end
...