私の外部記憶装置

ただの覚え書きです。ちょこちょこ見直して加筆・修正していますが、間違ってるかも😅

【Rails】権限昇格とその対策


概要

対策例

deviseを使った場合

# コントローラ
class HogesController < ApplicationController
  # 下記①で制限
  before_action :set_current_user_hoge, only: %i[edit update destroy]

  # 下記②で制限
  def index
    @blogs = Hoge.search(params[:term]).published
  end

  # 下記③で制限
  def show
    @blog = Hoge.allowed_viewing(current_user).find(params[:id])
  end

  # ...
  private

  # ①「ユーザのみの条件」でアクセス権を設定するクエリ
  def set_current_user_hoge
    @hoge = current_user.hoges.find(params[:id])
  end
# モデル
class Hoge < ApplicationRecord
  belongs_to :user

  # ②「モデルのみの条件」でアクセス権を設定するクエリ
  scope :published, -> { where('secret = FALSE') }

  # ③「ユーザとモデルの条件」でアクセス権を設定するクエリ
  scope :allowed_viewing, lambda { |current_user|
    where(user_id: current_user&.id).or(Hoge.published)
  }

【Rails】スコープ

参考(最新版)

Rails セキュリティガイド - Railsガイド