mcpField
L
laravel-policies

laravel-policies

github.com/leeovery安全1554 次安装2 周前更新
代码仓库

关于 laravel-policies

laravel-policies 是面向 Laravel 开发者的授权技能,介绍如何通过 Policy 委托权限系统,并结合所有权和资源状态检查访问规则。

主要功能

  1. 01标准与自定义 Policy 方法
  2. 02使用权限枚举
  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 命名约定
  • 保持简单、专注

评论

支持 Markdown