認可の習作: Action Policy: 入門

前回の続きで今回は認可の入門です。

1. 準備
2. 入門

入門

足場の生成
詳細はRails Integrationを参照してください。

bundle add action_policy

app/controllers/application_controller.rb
デフォルトのユーザを参照できるようにします。

class ApplicationController < ActionController::Base
  attr_reader :current_user

Postポリシーの追加
adminとPostの作成者自身は、Postの更新と削除を許可したいと思います。

rails g action_policy:policy Post

app/controllers/posts_controller.rb

  def update
    authorize! @post
# ...
  def destroy
    authorize! @post

app/policies/post_policy.rb
※ドキュメントにはrecord.idと書かれていますが、record.user_idがコードの雛形として生成されています。

class PostPolicy < ApplicationPolicy
  alias_rule :destroy?, to: :update?

  def update?
    user.admin? || (user.id == record.user_id)
  end
end

Postの更新と削除でエラーが発生することを確認します。
bin/rails s

画像1

画面

認可されたユーザのみ編集と削除のリンクを表示したいと思います。

app/policies/post_policy.rb

class PostPolicy < ApplicationPolicy
  alias_rule :edit?, :destroy?, to: :update?

app/views/posts/index.html.erb

        <td>
          <% if allowed_to?(:edit?, post) %>
            <%= link_to 'Edit', edit_post_path(post) %>
          <% end %>
        </td>
        <td>
          <% if allowed_to?(:destroy?, post) %>
            <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
          <% end %>
        </td>

bin/rails s

画像2
画像3

Administratorは、全ての編集と削除リンクが表示されています。
一般ユーザ(Foo)は、自分のPostのみ編集と削除リンクが表示されています。

CommentポリシーからPostポリシーの参照

rails g action_policy:policy Comment

app/policies/comment_policy.rb
PostPolicyのdestroy?はエイリアスのためなのか、呼び出すとエラーになりました。現時点で私はFWのコードを読んでいないため仕組みを理解できていません。

class CommentPolicy < ApplicationPolicy
  def destroy?
    user.admin? || (user.id == record.user_id) ||
      allowed_to?(:update?, record.post)
  end
end

app/views/comments/_comment.html.erb

    <% if allowed_to?(:destroy?, comment) %>
      <%= link_to 'Destroy', post_comment_path(comment.post, comment), method: :delete, data: { confirm: 'Are you sure?' }, remote: true %>
    <% end %>

bin/rails s

以下のように一般ユーザは自身が作成したPostのコメントは削除可能です。

画像4

また以下のように他のユーザが作成したPostのコメントについては、自分自身のコメントのみ削除可能です。

画像5

以上です。


この記事が気に入ったらサポートをしてみませんか?