【100日目】【1日20分のRailsチュートリアル】【第9章】ユーザーにログインを要求する処理を追加
遂に100日目!
今日は「9.2 認可」から。
9.2 認可
9.1のeditアクションとupdateアクションはすでに完全に動作していますが、セキュリティ上の大穴が1つ空いています。
どのユーザーでもあらゆるアクションにアクセスでき、ログインさえしていれば他のユーザーの情報を編集できてしまいます。
URL直打ちすれば他のユーザーの編集ページにアクセスできるってことかな。
9.2.1では、ログインしていないユーザーが保護されたページにアクセスしようとした際のケースについて対処していきます。
こういったケースはアプリケーションを使っていると普通に起こることなので、ログインページに転送して、そのときに分かりやすいメッセージも表示するようにしましょう。
よくありますね。確かに今はその機能ないや。
9.2.1 ユーザーにログインを要求する
図9.6のように転送させる仕組みを実装したいときは、Usersコントローラの中でbeforeフィルターを使います。
app/controllers/users_controller.rb
class UsersController < ApplicationController before_action :logged_in_user, only: [:edit, :update] : private : # beforeフィルター # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? flash[:danger] = "Please log in." redirect_to login_url end end end
デフォルトでは、beforeフィルターはコントローラ内のすべてのアクションに適用されるので、ここでは適切な:onlyオプションハッシュを渡すことによって:editと:updateアクションにのみこのフィルタが適用されるように制限をかけています。
フィルタかけられるのか。楽だなー。
beforeフィルターを使って実装した結果 (リスト9.12) は、一度ログアウトしてユーザー編集ページ (/users/1/edit) にアクセスしてみることで確認できます (図9.7)。
動作見てみよう。
サーバーを起動して
$ rails server -b $IP -p $PORT
アプリケーションからログアウトしていることを確認してユーザー編集ページにアクセス。
ログインページとログインを促すメッセージが表示されました。
ちょっと気になってるんだけど、セッションの永続化してるはずなのに日をまたぐ(パソコン再起動挟む)とログアウト状態になってるのはいいのかな。。
もしくは毎回新しいブラウザでアプリケーションにアクセスしているからか。
なんでだろう~。
リスト9.12のキャプションに記したように、今の段階ではテストは失敗します。
テスト失敗するようになってしまった。
editアクションやupdateアクションでログインを要求するようにしたため、らしい。
$ bundle exec rake test : FAIL["test_successful_edit", UsersEditTest, 2017-01-24 19:32:59 +0000] test_successful_edit#UsersEditTest (1485286379.47s) expecting <"users/edit"> but rendering with <[]> test/integration/users_edit_test.rb:21:in `block in <class:UsersEditTest>' FAIL["test_unsuccessful_edit", UsersEditTest, 2017-01-24 19:32:59 +0000] test_unsuccessful_edit#UsersEditTest (1485286379.48s) expecting <"users/edit"> but rendering with <[]> test/integration/users_edit_test.rb:11:in `block in <class:UsersEditTest>' 31 tests, 69 assertions, 2 failures, 0 errors, 0 skips
途中だけど今日はここまで。
今日の学習時間は【12分】。
次は「9.2.1 ユーザーにログインを要求する」のテストを修正するところから。