認可の習作: 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
画面
認可されたユーザのみ編集と削除のリンクを表示したいと思います。
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
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のコメントは削除可能です。
また以下のように他のユーザが作成したPostのコメントについては、自分自身のコメントのみ削除可能です。
以上です。
この記事が気に入ったらサポートをしてみませんか?