При использовании реализации ACL в Symfony2 в веб-приложении мы сталкиваемся с вариантом использования, когда предлагаемый способ использования ACL (проверка прав пользователей на одном доменном объекте) становится неосуществимым. Таким образом, мы задаемся вопросом, существует ли какая-то часть API ACL, которую мы можем использовать для решения нашей проблемы.
Случай использования находится в контроллере, который готовит список объектов домена, которые должны быть представлены в шаблоне, чтобы пользователь мог выбрать, какие из ее объектов она хочет редактировать. Пользователь не имеет права редактировать все объекты в базе данных, поэтому список должен быть соответствующим образом отфильтрован.
Это можно было бы (среди других решений) выполнить в соответствии с двумя стратегиями:
1) Фильтр запросов, который добавляет заданный запрос с действительными идентификаторами объектов из текущего ACL пользователя для объекта (или объектов). То есть:
WHERE <other conditions> AND u.id IN(<list of legal object ids here>)
2) Фильтр после запроса, который удаляет объекты, у которых у пользователя нет правильных разрешений после того, как полный список был извлечен из базы данных. То есть:
$objs = <query for objects>
$objIds = <getting all the permitted obj ids from the ACL>
for ($obj in $objs) {
if (in_array($obj.id, $objIds) { $result[] = $obj; }
}
return $result;
Первая стратегия предпочтительнее, поскольку база данных выполняет всю работу по фильтрации, и оба требуют два запроса к базе данных. Один для ACL и один для фактического запроса, но это, вероятно, неизбежно.
Есть ли какая-либо реализация одной из этих стратегий (или чего-то достичь желаемых результатов) в Symfony2?