czwartek, 5 lutego 2009

CakePHP, zgrzyt w SecurityComponent

Dostępny w CakePHP SecurityComponent to bardzo fajna sprawa. Szczególnie przydatną funkcją tego komponentu jest możliwość zwiększenia bezpieczeństwa formularzy tworzonych przy użyciu FormHelper. Jak wiadomo standardowo Cake w momencie gdy wywoływana jest metoda save modelu przyjmuje cała tablice z danymi które zostaną zapisane w bazie. Nie jest on jednak w stanie sprawdzić czy ktoś przypadkiem nie dopisał do formularz za pomocą np. FireBug'a jakiegoś dodatkowego pola którego dopisywać nie powinien. Oczywiście można w metodzie save dopisać listę dopuszczalnych pól ale jest to imho bardzo niewygodne. W tym momencie z pomocą przychodzi SecurityComponent. Poprzez proste dodanie go do aplikacji:
public $components = array('Security');
w momenci gdy tworzony będzie dowolny formularz doda on do niego token który będzie zawierał zakodowaną informację na temat pól jakie znajdują się w formularzu. Wszystko pięknie tyle, że podczas tworzenia tokenu Cake zakłada, że pola ukryte czyli takie które mają type = hidden nie będą zmieniały wartości. I tu pojawia się problem bo co zrobić jak ktoś wstawił sobie w formularzu kalendarz albo mapę Google i przed wysłaniem formularza chce zapisać w ukrytych polach nowe wartości? Za pewne można tworzyć zwykłe input'y i ukrywać je CSS'em ale nie o to chodzi. Naturalnie można temu zaradzić korzystając z możliwości ustawienia dla SecurityComponent wartości disabledFields:
$this->Security->disabledFields = array('Model.pole_1','Model.pole_2');
Wszystko byłoby pięknie gdyby nie fakt, że informację taką trzeba zawrzeć w metodzie beforeFilter() co trochę komplikuje sprawę w momencie gdy różne dane z jednego modelu edytujemy w różnych akcjach. Pewnie, że można dodać wszystkie pola jednocześnie ale czasami może przecież zdarzyć się tak że w jednej akcji na jakieś pole nie zwracamy uwagi a w innej w zależności od tego jaką ma ono wartość uzależniamy jakieś tam konkretne działania.
I to właśnie jest mój zgrzyt który naturalnie można obejść na milion sposobów w 2 minuty, tworząc np. tablicę zawierającą nazwy akcji oraz listę pól jakie mają być dopisane do disabledFields i w beforeFilter na podstawie nazwy akcji jaką chcemy wywołać dopisywać je do SecurityComponent.

1 komentarze:

asdafg pisze...

Dobry artykuł.. zaoszczędził nam trochę szukania :)