Mocne parametry i attr_accessible
to dwa różne sposoby dodawania zabezpieczeń do funkcji "przypisanie masy" w Railsach. Strong Parameters to metoda zalecana przez aktualną wersję Rails.
"Przypisanie masy" jest wygodnym skrótem w Railsach, który pozwala ustawić wiele właściwości modelu w pojedynczej instrukcji.
Na przykład wyobraź sobie, że masz @user
, którą chcesz zaktualizować danymi z przesłania formularza. Bez przydziału masy musiałbyś napisać żmudny kod:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
I dalej i dla każdego pola formularza.
masą zadania, cały ten kod staje się linia pojedyncza:
@user.update(params[:user])
Ale to jest pełna dziur bezpieczeństwa. Ponieważ params
zawiera wszystkie dane przesłane przez przeglądarkę, złośliwy użytkownik może dodać dane do tego zgłoszenia, czego się nie spodziewałeś. Na przykład mogą dodać is_admin=1
do parametrów. Jeśli masz kolumnę bazy danych is_admin
, to przypisanie masy po prostu pozwala użytkownikowi dokonać aktualizacji do administratora. Yikes!
To tutaj pojawiają się silne parametry. Przy silnych parametrach, Railsy podniosą ActiveModel::ForbiddenAttributesError
, jeśli spróbujesz zrobić naiwną update(params[:user])
. Zamiast tego musisz jasno określić parametry, jakich oczekujesz od przesłania przeglądarki, korzystając z pomocników, które zapewnia Strong Parameters. W ten sposób:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Nie mogę mówić za opiekunów Railsów, ale lubię Silne parametry, ponieważ jest elastyczny. Jeśli mam wiele akcji w kontrolerze użytkowników, które oczekują różnych parametrów, mogę łatwo opisać, używając parametrów, które powinny być dozwolone.
Jeśli mam różne role użytkowników, które mogą aktualizować różne atrybuty, mogę z łatwością modelować te uprawnienia. Jak wspomniano o @ CV-Gate, możesz nawet zmienić te uprawnienia w czasie wykonywania, co jest potężne.
Krótko mówiąc, elastyczność silnych parametrów wynika z faktu, że możesz zdefiniować tę metodę w dowolnym miejscu i jakkolwiek chcesz. Masz pełną moc koncepcji Ruby i OO, aby działało tak, jak chcesz.
Co z numerem attr_accessible
?
Nie wdając się w zbyt wiele szczegółów (ponieważ ta funkcja nie jest już obsługiwana przez Rails): zamiast przy użyciu metody permit
, byś zrobił coś podobnego za pomocą attr_accessible
makro w samym modelu, podobnie jak to:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
Tak więc dla prostych przypadków działa bardzo podobnie do Silnych parametrów; po prostu definiujesz listę atrybutów w innym miejscu.
Jednakże, ponieważ attr_accessible
jest silnie sprzężony z definicją klasy modelu, tracisz dużą elastyczność.Co jeśli masz dwa różne działania kontrolera, które muszą wykonać przypisanie masy dla tego samego modelu User
? Teraz utknąłeś.
attr_accessor
attr_accessor
makro jest wbudowany w Ruby i nie ma nic wspólnego z Rails, masowe cesją lub bezpieczeństwa. Po prostu ma podobną nazwę. :)