关于 laravel-policies
laravel-policies 是面向 Laravel 开发者的授权技能,介绍如何通过 Policy 委托权限系统,并结合所有权和资源状态检查访问规则。
主要功能
- 01标准与自定义 Policy 方法
- 02使用权限枚举
- 03所有权与状态检查
- 04在路由中进行 Policy 授权
- 05保持授权逻辑精简
适用场景
- 01实现资源访问规则
- 02执行操作前检查所有权
- 03根据资源状态限制操作
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ leeovery/ agentic-skills --skill laravel-policies安装后在 Claude Code 中输入/laravel-policies确认已加载。
详细介绍
Laravel 策略
策略封装授权逻辑,并委托给权限系统处理。
相关指南:
- routing-permissions.md - 路由级授权
- Enums - 权限枚举
结构
<?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