【102日目】【1日20分のRailsチュートリアル】【第9章】ユーザーが自分の情報だけを編集できるように実装を追加する
今日は「9.2.2 正しいユーザーを要求する」から。
9.2.2 正しいユーザーを要求する
当然のことですが、ログインを要求するだけでは十分ではありません。ユーザーが自分の情報だけを編集できるようにする必要があります。
勝手に自分の情報を編集されたら困るもんね。
そこで本項では、セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
ほぅほぅ。
まずはユーザーの情報が互いに編集できないことを確認するために、サンプルユーザーをもう一人追加します。ユーザー用のfixtureファイルに2人目のユーザーを追加してみましょう (リスト9.20)。
2人目のユーザーを追加。
test/fixtures/users.yml
archer: name: Sterling Archer email: duchess@example.gov password_digest: <%= User.digest('password') %>
次に、 リスト8.50で定義したlog_in_asメソッドを使って、editアクションとupdateアクションをテストします (リスト9.21)。
setup
でもう一つのユーザーとしてさっき追加ユーザーを設定して、
edit
/update
アクションそれぞれでログインしているユーザーとは別のユーザーのプロフィールページを編集/更新をチェックするテストを追加。
test/controllers/users_controller_test.rb
: def setup @user = users(:michael) @other_user = users(:archer) end : test "should redirect edit when logged in as wrong user" do log_in_as(@other_user) get :edit, id: @user assert flash.empty? assert_redirected_to root_url end test "should redirect update when logged in as wrong user" do log_in_as(@other_user) patch :update, id: @user, user: { name: @user.name, email: @user.email } assert flash.empty? assert_redirected_to root_url end end
別のユーザーのプロフィールを編集しようとしたらリダイレクトさせたいので、correct_userというメソッドを作成し、beforeフィルターからこのメソッドを呼び出すようにします (リスト9.22)。
別のユーザーのプロフィールを編集しようとしたらルートURLにリダイレクトする処理を追加する。
app/controllers/users_controller.rb
: before_action :correct_user, only: [:edit, :update] : # 正しいユーザーかどうか確認 def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless @user == current_user end end
beforeフィルターのcorrect_userで@user変数を定義しているため、リスト9.22ではeditとupdateの各アクションから、@userへの代入文を削除している点にも注意してください。
@user変数の定義は二重にはいらないってことかな。。。
コメントアウトしとこう。
def edit # @user = User.find(params[:id]) end def update # @user = User.find(params[:id]) :
ここまで実装できたらさっき追加したテストが通るはずなので、テスト実行。
$ bundle exec rake test 35 tests, 83 assertions, 0 failures, 0 errors, 0 skips
問題なし。
途中だけどキリがいいので今日はここまで。
今日の学習時間は【20分】。
次は「9.2.2 正しいユーザーを要求する」のリファクタリングから。