Как представить различные домены приложений в ACL?

Я работаю над веб-приложением, в котором разные группы пользователей имеют разный доступ к ресурсам. Думаю, пока ничего особенного, но есть нюанс; приложение разделено на «домены», поэтому каждая из наших клиентских организаций имеет собственное содержание. Здесь я использую более простую модель, чтобы проиллюстрировать свою проблему.

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

Resources: stories, announcements

Roles:
    guest   // read only access
    root    // unlimited access 
    editor  // like guest, but with r/w access to resource "stories"
    admin   // r/w access to both resources

Я придумал два разных подхода для реализации этого с помощью Zend_Acl, первый - просто использовать разные ACL для разных доменов, копируя приведенное выше для каждого домена. Второй - использовать только один ACL и добавлять новые роли для каждого домена:

Domains: domain0, domain1, domain2

Roles:
    guest
    root
    editor-domain0
    editor-domain1
    editor-domain2
    admin-domain0
    admin-domain1
    admin-domain2

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

Хорош ли какой-либо из этих подходов, или есть более эффективные способы работы с несколькими доменами?


person Markus Johnsson    schedule 03.02.2010    source источник


Ответы (1)


Другим решением может быть создание подкласса Zend_Acl, а точнее методов allow и deny.

Eg

allow($role, $action, $resource, $domain) {
 // parent::allow($role . '-' . $domain, $action, $resource);
}

Это не так просто, но идею вы поняли.

Я не уверен, что вы имеете в виду под экземплярами ресурсов, но я все равно предлагаю это: «домен-ресурса», например, разрешить («администратор», «действие», «история-домен0»).

person koen    schedule 03.02.2010
comment
Я использовал вариант этого ответа; но вместо создания подкласса Zend_Acl я создал служебные методы с такой же сигнатурой в другом классе, который вызывает соответствующие методы в Zend_Acl. - person Markus Johnsson; 09.02.2010