Laravel 的授权 (authorization) 系统控制已认证用户被允许做什么 (不同于认证 — 他们是谁)。Gates 是权限的简单闭包;Policies 是围绕特定模型组织授权逻辑的类 (例如谁可以更新一篇 Post)。
Gates — 简单的、基于闭包的权限
::(, fn() => ->());
(::()) { ... }
::();
Laravel 的授权 (authorization) 系统控制已认证用户被允许做什么 (不同于认证 — 他们是谁)。Gates 是权限的简单闭包;Policies 是围绕特定模型组织授权逻辑的类 (例如谁可以更新一篇 Post)。
::(, fn() => ->());
(::()) { ... }
::();
Gates 适合于不与特定模型关联的简单、独立权限。
<?php
// php artisan make:policy PostPolicy --model=Post
class PostPolicy {
public function update(User $user, Post $post): bool {
return $user->id === $post->user_id; // only the author can update
}
public function delete(User $user, Post $post): bool {
return $user->id === $post->user_id || $user->isAdmin();
}
}
Policy 类为模型分组授权规则 — 每个方法都回答"该用户是否可以在此模型上执行此操作?"。这使每个资源的授权逻辑保持有序。
// in a controller
public function update(Request $request, Post $post) {
$this->authorize('update', $post); // checks PostPolicy::update — throws 403 if denied
// ... proceed (we know the user is authorized)
}
// the user model
if ($request->user()->can('update', $post)) { ... }
{{-- in Blade — show UI only if authorized --}}
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">Edit</a>
@endcan
authorize()/can() 方法 (以及 Blade 中的 @can) 自动检查 policy — 当用户无权限时抛出 403 或隐藏 UI。
授权是必需的且安全关键的 — 控制已认证用户被允许做什么 (不仅仅是他们是否已登录) 是应用程序安全的基础,Laravel 的 policies 和 gates 提供了一种干净、有序的处理方式。
理解认证 (你是谁 — 登录) 和授权 (你能做什么 — 权限) 之间的区别是基础性的,授权失败会导致严重的漏洞 (用户访问或修改他们不应该的数据 — 破损的访问控制是顶级安全风险)。
Laravel 的系统提供两个互补的工具:Gates 用于简单、独立的权限 (基于闭包的检查),以及Policies — 常见的、推荐的方法 — 将模型的授权规则组织到专用类中 (例如谁可以更新或删除 Post),使授权逻辑按资源结构化且易于维护。
理解如何定义 policies/gates 和强制执行它们 ($this->authorize()、$user->can()、Blade 中的 @can — 在控制器中检查权限、抛出 403s、有条件地显示 UI) 对于构建安全应用程序很重要,其中用户只能执行被允许的操作。
由于几乎每个真实应用程序都需要细粒度的访问控制 (确保用户只能修改自己的资源、限制管理操作等),而且由于授权错误会造成危险的安全漏洞,了解 Laravel 的 policies 和 gates — 实现授权的正确、有序方式 — 是重要的安全相关高级知识,对于构建正确强制执行谁可以做什么的应用程序至关重要,这是真实系统中频繁且关键的需求。