При использовании реализации ACL в Symfony2 в веб-приложении мы столкнулись с вариантом использования, в котором предлагаемый способ использования ACL (проверка разрешений пользователей в одном домене или bject) становится невозможным. Таким образом,нам интересно, существует ли какая-то часть ACL API, которую мы можем использовать для решения нашей проблемы.
Вариант использования - контроллер, который подготавливает список объектов домена для представления в шаблоне, чтобы пользователь мог выбрать, какой из своих объектов он хочет отредактировать. У пользователя нет разрешения на редактирование всех объектов в базе данных, поэтому список должен быть соответствующим образом отфильтрован.
Это может (среди других решений) быть выполнено в соответствии с двумя стратегиями:
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?