Как использовать ACL для фильтрации списка объектов домена в соответствии с определенным пользователем разрешения (например, РЕДАКТИРОВАТЬ)?

При использовании реализации 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?

32
задан Problematic 8 September 2011 в 01:07
поделиться