Laravel - 授权:初学者指南

你好,未来的 Laravel 开发者们!今天,我们将深入了解 Laravel 授权的精彩世界。如果你是编程新手,不用担心——我将作为你的友好向导,一步步解释所有内容。让我们开始吧!

Laravel - Authorization

理解基础:身份验证与授权

在我们跳入 Laravel 的授权功能之前,让我们先澄清一个常见的混淆:

身份验证:你是谁?

将身份验证想象成俱乐部的门卫。它关乎证明你是谁。在数字世界中,这通常意味着使用用户名和密码登录。

授权:你被允许做什么?

现在,授权就像 VIP 名单。一旦你进入了俱乐部(经过身份验证),授权决定了你可以访问哪些区域。你可以进入 VIP 休息室吗?你被允许站在 DJ 桌后面吗?

在 Laravel 中,我们首先对用户进行身份验证,然后使用授权来控制他们可以在我们的应用程序中做什么。

Laravel 中的授权机制

Laravel 提供了一个强大且灵活的授权系统。让我们将其分解成易于消化的部分:

1. 闸门

闸门是基于闭包的简单方法来授权操作。你可以将它们视为应用程序中的检查点。

以下是如何定义一个闸门:

Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});

这个闸门检查用户是否有权限编辑一个帖子。如果用户的 ID 与帖子作者的 ID 相匹配,则返回 true。

在控制器中使用这个闸门:

if (Gate::allows('edit-post', $post)) {
// 用户可以编辑帖子...
}

或者在 Blade 模板中:

@can('edit-post', $post)
<!-- 显示编辑按钮 -->
@endcan

2. 策略

策略是将授权逻辑组织到特定模型或资源中的类。它们就像是应用程序中每个模型的安全保卫。

让我们为我们的 Post 模型创建一个策略:

php artisan make:policy PostPolicy --model=Post

这个命令创建了一个 PostPolicy 类。让我们在其中添加一个方法:

public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}

现在,你可以在控制器中使用这个策略:

$this->authorize('update', $post);

或者在 Blade 模板中:

@can('update', $post)
<!-- 显示更新按钮 -->
@endcan

3. 角色和权限

虽然 Laravel 没有内置的角色系统,但我们可以轻松实现一个。以下是一个简单的例子:

首先,让我们在我们的用户表中添加一个 'role' 列:

Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('user');
});

现在,让我们创建一个检查管理员权限的闸门:

Gate::define('admin', function ($user) {
return $user->role === 'admin';
});

我们可以在控制器或视图中使用这个:

if (Gate::allows('admin')) {
// 用户是管理员...
}
@can('admin')
<!-- 显示管理员面板链接 -->
@endcan

4. 中间件

Laravel 还允许你使用中间件在路由级别控制访问。让我们创建一个自定义中间件:

php artisan make:middleware CheckRole

在这个中间件的 handle 方法中:

public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
abort(403, '未授权的操作。');
}

return $next($request);
}

app/Http/Kernel.php 中注册这个中间件:

protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\CheckRole::class,
];

现在你可以在路由中使用它:

Route::get('/admin', function () {
//
})->middleware('role:admin');

方法表

以下是我们覆盖的主要方法的便捷表格:

方法 描述 示例
Gate::define() 定义一个新的授权闸门 Gate::define('edit-post', function ($user, $post) { ... })
Gate::allows() 检查一个闸门是否允许一个操作 Gate::allows('edit-post', $post)
$this->authorize() 在控制器中授权一个操作 $this->authorize('update', $post)
@can 授权的 Blade 指令 @can('update', $post) ... @endcan
Gate::forUser() 为特定用户获取一个闸门实例 Gate::forUser($user)->allows('edit-post', $post)

记住,授权是关于控制经过身份验证的用户在应用程序中可以做什么的。它是构建安全且用户友好的 Web 应用程序的重要组成部分。

随着你练习并构建更多的应用程序,你会对这些概念更加熟悉。不要害怕尝试——我们都是这样学习的!

祝编码愉快,未来的 Laravel 专家们!??‍??‍?

Credits: Image by storyset