mcpField
L
laravel-policies

laravel-policies

github.com/leeoveryセキュリティ1554 回インストール2 週間前に更新
リポジトリ

laravel-policies について

laravel-policiesは、Laravelで認可を実装する開発者向けのスキルです。Policyから権限システムへ委譲し、所有権やリソース状態の確認と組み合わせる方法を説明します。

主な機能

  1. 01標準およびカスタムPolicyメソッド
  2. 02権限Enumの使用
  3. 03所有権と状態の確認
  4. 04ルートでのPolicy認可
  5. 05簡潔な認可ロジック

活用シーン

  1. 01リソースのアクセス規則の実装
  2. 02操作前の所有権確認
  3. 03リソース状態に応じた操作制限

インストール

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

$npx skills add https://github.com/leeovery/agentic-skills --skill laravel-policies

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

詳細

Laravel ポリシー

ポリシーは認可ロジックをカプセル化し、権限システムに委譲します。

関連ガイド:

構造

<?php

declare(strict_types=1);

namespace App\Policies;

use App\Enums\Permission;
use App\Models\Order;
use App\Models\User;

class OrderPolicy
{
    public function viewAny(User $user): bool
    {
        return $user->can(Permission::ListOrders);
    }

    public function view(User $user, Order $order): bool
    {
        return $user->can(Permission::ViewOrders)
            && $order->customer_id === $user->customer_id;
    }

    public function create(User $user): bool
    {
        return $user->can(Permission::CreateOrders);
    }

    public function update(User $user, Order $order): bool
    {
        return $user->can(Permission::UpdateOrders)
            && $order->canBeModified()
            && $order->customer_id === $user->customer_id;
    }

    public function delete(User $user, Order $order): bool
    {
        return $user->can(Permission::DeleteOrders)
            && $order->isPending();
    }

    public function cancel(User $user, Order $order): bool
    {
        return $this->update($user, $order)
            && $order->canBeCancelled();
    }
}

権限の列挙型

<?php

declare(strict_types=1);

namespace App\Enums;

use Henzeb\Enumhancer\Concerns\Comparison;
use Henzeb\Enumhancer\Concerns\Dropdown;

enum Permission: string
{
    use Comparison, Dropdown;

    case ListOrders = 'list orders';
    case ViewOrders = 'view orders';
    case CreateOrders = 'create orders';
    case UpdateOrders = 'update orders';
    case DeleteOrders = 'delete orders';
    case CancelOrders = 'cancel orders';
}

標準的なポリシーメソッド

Laravel の規約に準拠したポリシーメソッド:

  • viewAny() - 一覧/インデックス
  • view() - 単一のリソースを表示
  • create() - 新しいリソースを作成
  • update() - リソースを更新
  • delete() - リソースを削除
  • restore() - ソフトデリートされたリソースを復元
  • forceDelete() - リソースを完全に削除

標準以外のアクションにはカスタムメソッドを使用します:

  • cancel()
  • approve()
  • ship()
  • など

主なパターン

1. 権限システムに委譲する
return $user->can(Permission::CreateOrders);
2. 所有権の確認
return $user->can(Permission::ViewOrders)
    && $order->customer_id === $user->customer_id;
3. 状態の確認
return $user->can(Permission::DeleteOrders)
    && $order->isPending();
4. 既存のメソッドを組み合わせる
public function cancel(User $user, Order $order): bool
{
    return $this->update($user, $order)
        && $order->canBeCancelled();
}

ルートでの使用

Route::get('/orders', [OrderController::class, 'index'])
    ->can('viewAny', Order::class);

Route::get('/orders/{order}', [OrderController::class, 'show'])
    ->can('view', 'order');

Route::post('/orders', [OrderController::class, 'store'])
    ->can('create', Order::class);

ルートの認可については、routing-permissions.md を参照してください。

まとめ

ポリシーでは次の点を守ってください:

  • 文字列ではなく権限の列挙型を使用する
  • 必要に応じて所有権を確認する
  • 必要に応じて状態を確認する
  • 権限システムに委譲する
  • Laravel の命名規約に従う
  • シンプルで焦点を絞った状態に保つ

コメント