🦔

【Rails】deviseのメソッドを使ったアクセス権限

2023/11/21に公開

deviseの導入後に他のユーザーから直接URLで編集画面に飛んで更新されてしまうのを防止する方法について、会員側と顧客側で分かれている場合のやり方を復習したいと思います。

前提条件

  • deviseを導入済
  • 表示に関して「ログインしているユーザー本人のみ、編集リンクを表示させる」という機能を実装済み
  • 管理者アカウントが1つの場合

会員側

こちらでは、コントローラにて下記の記述を行うことで可能になります。

public/users_controller.rb
class Public:: UsersController < ApplicationController
  before_action :is_matching_login_user, only: [:edit, :update]
  :
  :
  private
  :
  :
  def is_matching_login_user
    @user = User.find(params[:id])
    unless @user.id == current_user.id
      redirect_to user_path(current_user.id)
    end
  end
  
end

before_actionは、コントローラーで各アクションを実行する前に実行したい処理を指定することができるメソッドです。
こちらでは、この後に続くis_matching_login_user, only: [:edit, :update]でログインしているユーザーが編集や更新を行う対象のユーザーと一致しているかどうかを確認するために使用されています。

管理者側

管理者側では、上記と同じようにis_matching_login_adminにすることも可能かとは思いますが、今回は管理者アカウントが1つのため、管理者権限を持つユーザーのみがアクセスできるようにします。

admin側のコントローラ
class Admin::〇〇〇Controller < ApplicationController
  before_action :authenticate_admin!, only: [:edit, :update]
  :
  :
end
before_action :authenticate_admin!, only: [:edit, :update]

authenticate_admin!は、deviseによって提供されるメソッドの一つで、ここでは管理者権限をもつアカウントのみがonly: [:edit, :update]によって編集画面にアクセスできるようになります。

まとめ

  • is_matching_loginはログインしているユーザーが編集や更新を行う対象のユーザーと一致しているかどうかの確認に使用される。
  • authenticateは、ログインしているかどうかを確認するために使用されます。

ログインしないとできない機能を振り分けたり、他のユーザーからの編集を防いだりと、上記2つのメソッドを使い分けることで自分の理想のサイト作りに繋げていければと思います。

参考サイト

https://pikawaka.com/rails/before_action

Discussion