Ruby: полиморфные ассоциации Declarative_authorization

У меня две модели (Предмет и Тема). Оба они принадлежат пользователям третьей модели с ассоциацией has_many (у пользователя много тем и элементов). И у предмета, и у темы есть_many: images.

Модель изображения представляет собой полиморфную ассоциацию, поэтому в таблице есть столбцы imageable_id и imageable_type. Если бы у меня были и элемент с идентификатором 1, и тема с идентификатором 1, таблица выглядела бы так:

id    imageable_id    imageable_type
------------------------------------
1     1               Item
2     1               Theme

Я использую declarative_authorization для перезаписи SQL-запросов моей базы данных, чтобы пользователи не могли получить доступ к элементам за пределами их учетной записи. Я хотел бы написать правило авторизации, которое позволит пользователю читать изображение, только если он может читать принадлежащий ему элемент. Кажется, я не могу получить правильный синтаксис (возможно, он не поддерживается):

has_permission_on [:images], :to => [:manage], :join_as => :and do
  if_attribute :imageable => is { "Item" }
  if_permitted_to :manage, :items # Somehow I need to tell declarative_auth to imageable_id is an item_id in this case.
end

Тогда у меня было бы другое правило, имитирующее приведенное выше, но для тем:

has_permission_on [:images], :to => [:manage], :join_as => :and do
  if_attribute :imageable => is { "Theme" }
  if_permitted_to :manage, :themes # Somehow I need to tell declarative_auth to imageable_id is a theme_id in this case.
end

Любые идеи? Заранее спасибо!

  • Корит Малин

person Corith Malin    schedule 03.09.2010    source источник
comment
Очень старый драгоценный камень, полиморфные ассоциации, похоже, не поддерживаются: github.com/stffn/declarative_authorization/ вопросов / 114. Почему бы не использовать что-то вроде канканкана? github.com/CanCanCommunity/cancancan   -  person gdurelle    schedule 22.12.2015
comment
Я имею в виду ... Это не было старым сокровищем, когда я написал это и опубликовал в 2010 году.   -  person Corith Malin    schedule 31.01.2017


Ответы (1)


Похоже, вы допустили ошибку в методе has_permission_on

Как я проверил, имеет = "https://github.com/stffn/declarative_authorization/blob/45e91af20eba71b2828c5c84066bcce3ef032e8a/lib/declarative_authorization/reader.rb#L397" rel = "nofollow"> if_attribute

  has_permission_on(:images, :to => :manage, :join_as => :and) do
    if_attribute :imageable => "Item"
    if_permitted_to :manage, :items
  end

Надеюсь, это поможет вам !!!

person Gupta    schedule 23.12.2015