Пожалуйста, помогите мне реализовать списки контроля доступа для моего веб-приложения PHP. Я использую Zend_ACL специально.
Мне нужен детальный контроль в масштабе всего приложения над тем, какой конкретный объект (будь то пользователь или группа) имеет доступ к какому-либо ресурсу. Я хотел бы иметь возможность предоставить доступ к конкретному экземпляру ресурса, но также и ко всем ресурсам этого типа. Например:
- Пользователь # 1 имеет права на редактирование всех сообщений
- Пользователь # 2 является гостевым редактором и имеет права на редактирование сообщения с идентификатором # 5
- Группа № 1 (гость) имеет права на чтение для всего
- Пользователи принадлежат к группе пользователей, которая наследуется от гостя.
Мой вопрос таков: должен ли ACL ссылаться на типы ресурсов или их конкретные экземпляры? Должен ли я предоставить пользователям основные привилегии для всего типа ресурса, используя ACL, например:
- предоставить редактирование пользователю # 1 в сообщении
- предоставьте пользователю # 2 не более чем наследство
- Грант группы № 1 для чтения на всех ресурсах
- реализовать таблицу исключений для отслеживания разрешений и запретов на определенных ресурсах
Или я должен создать ресурсы для всех отдельных экземпляров своих различных типов ресурсов и пойти на грандиозное разрешение, чтобы позволить всем пользователям читать все ресурсы? Кажется довольно грубой.
Мое текущее решение заключается в следующем: используя наследование ресурсов, создайте самый родительский ресурс без типа, потомок этого корня для каждого типа, а затем потомок каждого типа для каждого экземпляра. Это позволяет мне предоставлять один конкретный тип и отказывать в нескольких экземплярах, или запрещать определенный тип, но предоставлять один экземпляр (как для пользователя № 2 выше). Это прекрасно объединяет мою систему разрешений, однако мои потребности более сложны. Вскоре типы ресурсов будут вложенными. Поэтому у меня будут разные модули, которые могут быть родителями или детьми. Пример: модуль фотогалереи для всего сайта, модуль объявлений с другой, более эксклюзивной галереей, расположенной под ним. Я не совсем уверен, что делать, чтобы решить эту проблему. Я все еще хотел бы иметь возможность предоставлять на все галереи, или только одну, или просто так несколько фотографий внизу. Имейте в виду, что Zend_ACL не поддерживает множественное наследование ресурсов.
Каков наилучший способ реализовать это? Все с ACL или с использованием некоторой логики, встроенной в каждый модуль?