Разработка current_user против user_id, переданного в параметрах, действие обновления вложенных ресурсов

Я использую Devise для аутентификации. У меня есть две модели, в которых у пользователя есть один профиль, а профиль принадлежит пользователю:

class User < ActiveRecord::Base
  has_one :profile, dependent: :destroy 
end 

class Profile < ActiveRecord::Base
  belongs_to :user
end

Я использую вложенные ресурсы, например.

resources :users do
  resource :profile
end

Чтобы создать новый профиль пользователя, я использую префикс new_user_profile_path(current_user), который ведет к prifile#new и т. д.

Чтобы обновить профиль пользователя, я делаю следующее

# e.g. users/123/profile
current_user.profile.update(profile_params) 

Это кажется неправильным, потому что я не использую the user_id => 123 в профиле params. Должен ли я находить профиль пользователя по user_id вместо этого, например.

@profile = Profile.find_by(user_id: params[:user_id])
@profile.update(profile_params)

Кроме того, пользователь не может редактировать профиль других пользователей.

Спасибо за ответ.


person Elvyn Mejia    schedule 08.10.2016    source источник
comment
weblog.jamisbuck.org/2007/2/5/nesting-resources   -  person max    schedule 09.10.2016


Ответы (1)


current_user.profile.update(profile_params) — приемлемый способ обновления профиля текущего пользователя.

Это также помогает защитить профиль от редактирования другим пользователем. Если вы основываете идентификатор пользователя на параметрах, переданных из строки запроса, это небезопасно и позволит любому вошедшему в систему пользователю обновить профиль другого пользователя.

Например, используя спокойные маршруты, любой, у кого есть доступ, мог публиковать сообщения в /users/profiles/:id, даже если это не был их собственный идентификатор.

current_user является экземпляром модели User и уже содержит атрибут user_id.

person Jason Yost    schedule 09.10.2016
comment
Это имеет большой смысл, и я фактически исключил user_id из разрешенных параметров. - person Elvyn Mejia; 09.10.2016