Podczas korzystania z implementacji listy ACL w Symfony2 w aplikacji sieciowej, natrafiliśmy na przypadek użycia, w którym sugerowany sposób korzystania z list ACL (sprawdzanie uprawnień użytkowników dla pojedynczego obiektu domeny) staje się niewykonalny. Zastanawiamy się więc, czy istnieje część API ACL, którą możemy wykorzystać do rozwiązania naszego problemu.Jak używać listy ACL do filtrowania listy obiektów-domen zgodnie z uprawnieniami określonego użytkownika (np. EDYCJA)?
Przypadek użycia znajduje się w kontrolerze, który przygotowuje listę obiektów domen, które mają być prezentowane w szablonie, aby użytkownik mógł wybrać, które z jej obiektów chce edytować. Użytkownik nie ma uprawnień do edycji wszystkich obiektów w bazie danych, więc lista musi zostać odpowiednio przefiltrowana.
Mogłoby (wśród innych rozwiązań) odbywać według dwóch strategii:
1) filtru zapytania, dołącza danego zapytania z prawidłowych identyfikatorów obiektów z ACL aktualny użytkownik jest na obiekt (lub obiekty). Tj:
WHERE <other conditions> AND u.id IN(<list of legal object ids here>)
2) Filtr po kwerendy, która usuwa obiekty użytkownik nie posiada odpowiednich uprawnień do po pełna lista została pobrana z bazy danych. Np.:
$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;
Pierwsza strategia jest lepsza, ponieważ baza danych wykonuje wszystkie prace filtrujące, a obie wymagają dwóch zapytań do bazy danych. Jeden dla list ACL i jeden dla faktycznego zapytania, ale prawdopodobnie jest to nieuniknione.
Czy jest jakaś implementacja jednej z tych strategii (lub czegoś, co przynosi pożądane rezultaty) w Symfony2?
Ale nie rozumiem, jak chcesz obsługiwać większe zbiory danych z tym. Wyobraź sobie, że masz 10000 rekordów, nawet z paginacją w miejscu, musiałbym wiedzieć, ile rekordów jest własnością użytkownika. Czy istnieje sposób bez przechodzenia przez WSZYSTKIE encje w tabeli? – stoefln
Całkowicie zgadzam się z @stoefln, takie rozwiązanie jest niepraktyczne w przypadku większych zbiorów danych. [Odpowiedź Diego] (http://stackoverflow.com/a/7452467/539560) wygląda lepiej, ale nie jestem tego pewien ... – Xuni
+1 Po tym jak wpatrywałem się beznadziejnie w dokumentację, w końcu miałem trochę (nieco niepowiązane), ale bardzo pomocne objawienie ACL czytające tę odpowiedź. Dziękuję za to :) –