mcpField
A
action-policy-coder

action-policy-coder

github.com/majesticlabs-devセキュリティ5062 回インストール7 週間前に更新
リポジトリ

action-policy-coder について

Rails アプリケーションで ActionPolicy による認可を実装するコーディングスキルです。ポリシールール、コントローラーチェック、スコープ、キャッシュ、エラーメッセージのローカライズ、テストに加え、GraphQL や ActionCable との連携を扱います。

主な機能

  1. 01ポリシークラス、ルール、継承
  2. 02コントローラーでの認可チェック
  3. 03認可済みリレーションのスコープ
  4. 04ポリシー結果のキャッシュ
  5. 05失敗メッセージのローカライズ
  6. 06RSpec と GraphQL の指針

活用シーン

  1. 01Rails モデルへの認可ルール追加
  2. 02ユーザー権限に応じたコレクションの絞り込み
  3. 03ポリシーとリクエストのスペック作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/majesticlabs-dev/majestic-marketplace --skill action-policy-coder

インストール後、Claude Code で/action-policy-coderを入力して読み込まれたか確認します。

詳細

ActionPolicy Coder

呼び出されたとき

  1. ポリシークラスを作成し、適切なルールと継承を設定します
  2. コントローラーで authorize! と allowed_to? を使用して認可を実装します
  3. フィルタリングされたコレクションに authorized_scope を使用してスコープを設定します
  4. パフォーマンスを最適化するためにキャッシュを設定します
  5. ローカライズされた失敗メッセージのためにI18nを追加します
  6. ActionPolicy RSpecマッチャーを使用してテストを作成します
  7. GraphQLおよびActionCableと統合します

インストール

# Gemfile
gem "action_policy"
gem "action_policy-graphql"  # For GraphQL integration

# Generate base policy
bin/rails generate action_policy:install
bin/rails generate action_policy:policy Post

ポリシークラス

ApplicationPolicyベース
# app/policies/application_policy.rb
class ApplicationPolicy < ActionPolicy::Base
  alias_rule :edit?, :destroy?, to: :update?
  pre_check :allow_admins

  private

  def allow_admins
    allow! if user.admin?
  end
end
リソースポリシー
# app/policies/post_policy.rb
class PostPolicy < ApplicationPolicy
  def index? = true
  def show? = true
  def update? = owner?
  def destroy? = owner? && !record.published?
  def publish? = owner? && record.draft?

  private

  def owner? = user.id == record.user_id
end

コントローラーとの統合

class PostsController < ApplicationController
  def show
    @post = Post.find(params[:id])
    authorize! @post
  end

  def update
    @post = Post.find(params[:id])
    authorize! @post
    @post.update(post_params) ? redirect_to(@post) : render(:edit)
  end

  def publish
    @post = Post.find(params[:id])
    authorize! @post, to: :publish?
    @post.publish!
    redirect_to @post
  end
end
条件付きレンダリング
<% if allowed_to?(:edit?, @post) %>
  <%= link_to "Edit", edit_post_path(@post) %>
<% end %>

ポリシースコープ

class PostPolicy < ApplicationPolicy
  relation_scope do |relation|
    user.admin? ? relation.all : relation.where(user_id: user.id).or(relation.published)
  end

  relation_scope(:own) { |relation| relation.where(user_id: user.id) }
  relation_scope(:drafts) { |relation| relation.where(user_id: user.id, status: :draft) }
end

# Controller usage
@posts = authorized_scope(Post.all)
@drafts = authorized_scope(Post.all, type: :relation, as: :drafts)

キャッシュ

class PostPolicy < ApplicationPolicy
  def update?
    cache { owner_or_collaborator? }  # Cache expensive checks
  end
end

# config/initializers/action_policy.rb
ActionPolicy.configure do |config|
  config.cache_store = Rails.cache
end

I18n失敗メッセージ

# config/locales/action_policy.en.yml
en:
  action_policy:
    policy:
      post_policy:
        update?: "You can only edit your own posts"
        destroy?: "You cannot delete a published post"
class ApplicationController < ActionController::Base
  rescue_from ActionPolicy::Unauthorized do |exception|
    flash[:alert] = exception.result.message
    redirect_back fallback_location: root_path
  end
end

成果物

認可を実装する際は、次を提供します。

  1. ポリシークラス:ルール、スコープ、キャッシュを含みます
  2. コントローラーとの統合:authorize! と allowed_to? の使用
  3. スコープ設定:indexアクションおよびフィルタリングされたコレクション向け
  4. I18n:ローカライズされたエラーメッセージ
  5. テスト:RSpecポリシーおよびリクエストスペック
  6. GraphQL:該当する場合はミューテーションにpreauthorizeを使用

コメント