2015-08-23 1 views
0

Я использую Pundit для авторизации и хочу поделиться логикой между классами политики. До сих пор я использовал простые рубиновые модули и включил их, но не нашел хорошего решения для классов Scope scudit.полномочия множественного наследства (областями, модулями)?

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

Например

class PagePolicy < ApplicationPolicy 
    # restrict access to current pages 
    include PublishedOnlySharedPolicy 
    # enable section editors to update their tagged content 
    include TagsAclSharedPolicy 
end 

module TagsAclSharedPolicy 
    def update? 
    admin.in_tag_acl?(record) || super 
    end 

    def show? 
    admin.in_tag_acl?(record) || super 
    end 

    def scope 
    # ... can't do this? 
    end 
end 

Эти модули работают отлично для обычные методы ACL создать? Обновить? и т. д., но области являются головоломкой, поскольку они являются определениями классов вместо методов.

Я ожидаю, что состав области позволит мне взять область базового класса и ограничить ее добавлением, где утверждения обычно, или расширить его, используя супер, вырвать и создать новую область с помощью union.

Есть ли чистый способ сделать это без метапрограммирования? Или нужна ли библиотека для изменения динамических областей вместо использования определений классов?

Почему Pundit использует определения классов для областей в любом случае?

ответ

0

Ответ получен в https://github.com/elabs/pundit/issues/310, если кому-то интересно.

В основном добавьте метод идентификаторов белого списка в область применения политики приложения, а затем переопределите это с нормальным рубином в классе областей действия каждой политики, с любым общим кодом области, входящим в его собственный модуль и включенным в область.

Может быть в метафоре что-то даже сушилка, но это работает.