rails 技術ブログ

rails 技術ブログ

勉強したことをアウトプットしていきます

【Pundit】認証・認可とは

認証とは

相手が誰かを確認すること

例:
ログインするにはメールアドレスとパスワードを入力する事で、誰であるかを確認し(認証)、ログインできる。


認可とは

ある特定の条件に対して、リソースアクセスの権限を与えること

例:
記事の作成、更新→全員可能
ユーザーの管理(作成、更新)→admin(管理者)のみ


認可を設定するのに便利なGem

Railsでは認可を設定できる、便利なGemがいくつかあります。
特に有名なのが「Pundit」と「cancancan」というGemです。

Pundit
→リソースに対して、どのユーザーであれば処理が許可されるのかを定義するものです。

class ArticlePolicy < ApplicationPolicy
  def index?
    true  #-> 全員が実行可能
  end

  def show?
    true
  end

  def create?
    user.admin? || user.editor?  # -> 管理者(admin)か編集者(editor)が実行可能
  end

  def edit?
    true
  end

  def update?
    user.admin? || user.editor?
  end

  def destroy?
    user.admin? || user.editor?
  end
end


cancancan
→cancanという有名な権限管理gemの後継。cancanの開発がストップしてしまったため、有志達によって、その後継であるcancancanが開発されているそうです。
考え方はPunditと逆で、各ユーザー毎に、どのような権限を持っているのかで権限を管理します。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?  #adminユーザーは全ての権限が与えられている
      can :manage, :all
     #[can? or cannot?] [:権限], [対象のオブジェクト] の形で権限設定を行う
    end

    if user.member?  #memberユーザーは読み込みの権限が与えられている
      can :read, :all
    end
  end
end

権限は基本的に以下の5種類です。

read: 読み込み, create: 新規作成, update: 更新, destroy: 削除, manage: 全て



■参考にした記事

[Rails5]cancancanってなんぞ? - Qiita

スマホアプリの認証・認可周りを整理した - Qiita

Pundit + Railsで認可の仕組みをシンプルに作る - Qiita