Załóżmy teraz, że użytkownik może przeglądać osoby jedynie z Łodzi z filtrem na wiek:
Items?age>18
Ale teraz jakiś sprytny Pan zmienia mi w locie ten request na:
Items?city=Poznań&age>18
I w tym momencie jak ma zachować się serwer? Serwer teraz powinien zrobić dodatkowe sprawdzenie filtra. Ewentualnie pobrać rekordy i sprawdzić, czy użytkownik ma uprawnienia do przeglądania tych rekordów (lub wykluczyć z wyniku te, do których nie ma uprawnień). Jak takie rzeczy się ogrania w WebAPI?
No, ale jeśli filtr na miasto zależy od zalogowanego użytkownika, to nie powinien być w ogóle dostępny przez query string tylko dynamicznie dodawany po stronie aplikacji.
To pierwsze da się osiągnąć banalnie, wystarczy, że obiekt bindowany z query stringa nie będzie miał właściwości City
.
A do drugiego przydaje się właśnie prawdziwy ORM - taki, który pozwala dodawać globalne filtry do kontekstu oraz claimsy użytkownika dostarczające wartości dla danego filtru. Wtedy po prostu w fabryce kontekstów wystarczy aktywować filtr, który zawsze będzie działał dla wybranych tabel, więc mamy
gwarancję, że użytkownik nie zobaczy ani nie zmieni danych nie przeznaczonych dla siebie.
Można to też zaimplementować ręcznie, po prostu dodając where w miejscu wykonywania wszystkich zapytań, dlatego warto aby było jedno. Tylko tam znowu się przydadzą claimsy albo inne źrodło kontekstowej informacji o użytkowniku.
W ostateczności można taki warunek doklejać do każdego budowanego zapytania, tylko tu jest ryzyko, że w którymś miejscu to przeoczymy i ktoś zobaczy nie swoje dane.
A pisanie dziesiątek ifów i metod sprawdzających czy dany użytkownik może zbudować dany warunek, to więcej kodu, a zatem więcej możliwości przeoczenia czegoś i w konsekwencji udostępnienia danych niepowołanej osobie.
mad_penguin