多くの書籍やチュートリアルで、update
params[:id] または session[:id] によってユーザー データを検索する方法として、ユーザー コントローラーにメソッドを実装している人を見かけます。ただし、セッションまたはアドレスバーを変更するだけで、他の人のアカウントにハッキングして、その人の情報を変更できると思います。そのため、ユーザーが他の情報を変更するのではなく、自分の情報のみを更新できるようにする方法を教えてください。
4 に答える
いくつかのものを非公開にする必要があるアプリケーションで作業しているときに、この問題が発生したことがあります。私がしたことは、優れた Rails プラクティスと共にDeviseとCancanを使用することでした。認証にはDevise、承認にはcancanを使用しました。
場合によっては、hidden_field を使用してフォームからユーザー ID を渡すことができます。コントローラーの作成アクションで user_id を渡すことをお勧めします。また、devise を使用する場合は、現在のユーザーのセッションと ID に基づいてのみモデルを作成する current_user メソッドにアクセスできます。
cancan を使用してユーザー情報を保護します。たとえば、user2 が写真を見ることなく、そのようにユーザーの写真しか表示できなかったとします。
@photos = current_user.photos #only grabs current users photos
cancan を使用すると、次のようにして、ユーザーが users/2/edit のような URL を手動で入力するのを防ぐことができます。
アビリティ.rb
can :manage, Photo, :user_id => user.id
controller.rb
load_and_authorize_resource :photo
def index
authorize! :index, @photo
end
Treat the User model the same as any other model and add your authentication to it and require the user to be logged in (e.g. current_user for some auth methods) within the uddate method.
if current_user
update_stuff and redirect
else
:notice => 'Not authd' and redirect
end