Laravel - 授權:初學者指南

你好,未來的 Laravel 開發者們!今天,我們將進入 Laravel 授權的精彩世界。別擔心你對編程還是新手——我將成為你這次旅程中的友好導遊,逐步解釋一切。我們開始吧!

Laravel - Authorization

了解基礎:認證 vs 授權

在我們深入了解 Laravel 的授權功能之前,讓我們先澄清一個常見的困惑:

認證:你是誰?

把認證想成夜店的保安。這是關於證明你是誰。在數字世界中,這通常意味著使用用戶名和密碼登錄。

授權:你被允許做什麼?

現在,授權就像 VIP 名單。一旦你進入夜店(認證成功),授權就會決定你能進入哪些區域。你可以進入 VIP 賴廳嗎?你被允許站在 DJ 樓嗎?

在 Laravel 中,我們首先對用戶進行認證,然後使用授權來控制他們在我們應用程序中能夠做什麼。

Laravel 中的授權機制

Laravel 提供了一個強大且靈活的授權系統。讓我們將其分解成容易理解的部分:

1. Gate(閘門)

Gate 是一種基於閉包的簡單授權方式。把它們想成是你應用程序中的檢查站。

以下是定義一個閘門的方式:

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. Policy(策略)

Policy 是組織特定模型或資源授權邏輯的類。它們就像是應用程序中每個模型的專門保安。

讓我們為我們的 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. 角色(Role)和權限(Permission)

雖然 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. 中間件(Middleware)

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)

記住,授權是關於控制認證用戶在應用程序中能夠做什麼的。這是構建安全和用戶友好的網絡應用程序的重要部分。

隨著你練習和開發更多的應用程序,你會越來越熟悉這些概念。不要害怕嘗試——我們都是這樣學習的!

祝開發愉快,未來的 Laravel 專家!??‍??‍?

Credits: Image by storyset