Zauważyłem, że wraz ze wzrostem serwisu pojawiać się będzie coraz większa liczba uprawnień, które skrypt najprawdopodobniej będzie musiał każdorazowo wczytywać z bazy nawet, gdy nie są one wykorzystywane. Łatwo sobie wyobrazić, co będzie mieć miejsce, gdy zdefiniujemy tysiąc zasobów i jednej z grup damy uprawnienia do 700. Oznacza to ilość niepotrzebnie zasysanych rekordów liczoną w setkach, podczas gdy pojedyncza akcja nie sprawdza więcej, niż kilka uprawnień naraz. Rozwiązaniem tego problemu mogą być różne formy cache'owania.
Pierwsza, to cache'owanie całej listy dla każdej roli z osobna, jako że tak dużo ich też w systemie nie ma, a same uprawnienia nie zmieniają się codziennie. Jednak tutaj nadal musimy wczytywać tego strasznie dużo, tyle że tym razem z pliku. Trochę bardziej rozsądne wydaje się napisanie mechanizmu dynamicznie określającego, co jest potrzebne, a co nie. Popatrzmy: ładuje się jakaś akcja. ACL sprawdza, czy ma w jakimś pliku zapisaną listę uprawnień, które będzie ona sprawdzać. Jeżeli znajdzie się taka, wczytuje ją i ładuje z bazy tylko te uprawnienia, które będą sprawdzane. W przeciwnym wypadku po staremu ładuje wszystko, lecz tym razem w trakcie wywoływania metody isAllowed() zapamiętuje sobie, o co skrypt się pytał. Pod koniec obsługi żądania tablica ze spisem żądanych uprawnień jest zrzucana do pliku tak, aby następne żądania nie musiały już pobierać wszystkiego. Według mnie brzmi to rozsądnie.







Napisał eRiZ w czwartek, 24 maja 2007 o 15:32
Też kiedyś głowiłem się, jak ten problem rozwiązać i przyszła mi pewna myśl - tabela typu memory i podczas logowania użytkownika selecta wyniki przekierowywać do tej tabeli.
Owszem, można jeszcze na plikach, a to takie moje skromne zdanie... ;]