0
0

More than 1 year has passed since last update.

railsチュートリアル第10章 正しいユーザーを要求する

Posted at

正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end
#正しいユーザーを要求する

セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

fixtureファイルに2人目のユーザーを追加する

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

間違ったユーザーが編集しようとしたときのテスト

test/controllers/users_controller_test.rb

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

beforeフィルターを使って編集/更新ページを保護する

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips

current_user?メソッド

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end

  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか?
    # trueを返す
  end
.
.
.
end

最終的なcorrect_userの実装

app/controllers/users_controller.rb

class UsersController < ApplicationController
.
.
.   
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end

演習

1.
何故editアクションとupdateアクションを両方とも保護する必要があるのでしょうか? 考えてみてください。

ユーザーでは無い人が書き換えることができるから
2.
上記のアクションのうち、どちらがブラウザで簡単にテストできるアクションでしょうか?

GETメソッドのeditの方がURLを打ち込んでアクセスするのみだから editアクションらしい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0