「線上產品瀏覽系統」是提供消費者線上查看產品資訊,並沒有做購物車結帳功能、串金流。
所以我希望做一個簡單的會員系統,消費者需要註冊會員,登入後才能查看產品,讓我能夠掌握這些消費者的資訊。
除了可以會員行銷,後續結帳有什麼問題也有會員資訊能核對。
權限 | 說明 |
---|---|
管理員 | 1. 瀏覽所有產品、類別資料 |
2. 查詢特定產品、類別資料 | |
3. 關鍵字搜尋 | |
4. 產品及類別所有的新增、刪除、修改操作 | |
一般會員 | 1. 瀏覽所有產品資料 |
2. 查詢特定產品資料 | |
3. 關鍵字搜尋 |
要在 users 表中加入 role 欄位來區分「管理員」和「一般會員」的權限。
php artisan make:migration add_role_to_users_table --table=users
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddRoleToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('一般會員')->after('password'); // 在 'password' 欄位後新增 'role'
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('role');
});
}
}
php artisan migrate
根據我的需求:
role
欄位來區分「管理員」和「一般會員」的權限,這樣的邏輯是比較簡單的,所以使用 Middleware 即可。Laravel 11 的版本有大改動,如果需要註冊 Middleware 要到 bootstrap/app.php檔案中操作。
但 Laravel 11 自動處理了許多常用的 Middleware,像是 auth、throttle 這些已經預先設定好,所以可以直接在路由上使用 Middleware,而不需要再像以前那樣手動去 Kernel.php 註冊。
/**
* Check if the user has a specific role.
*
* @param string $role
* @return bool
*/
public function hasRole($role)
{
return $this->role === $role;
}
這樣 $role 可以是 ‘管理員’ 或是 ‘一般會員’,甚至是 ‘VIP會員’ 等等,使用此方法未來會方便擴展使用及維護。
php artisan make:middleware RoleMiddleware
在剛剛建立的 RoleMiddleware
中,編輯 handle
方法來檢查會員的權限:
public function handle($request, Closure $next, $role)
{
// 檢查會員是否已登入,且會員的權限是否符合要求
if (!$request->user() || $request->user()->permission !== $role) {
// 如果會員未登入或權限不符合,回傳一個 403 的 JSON 錯誤回覆
return response()->json(['error' => '權限不足'], 403);
}
// 如果權限符合要求,將請求傳遞給下一個中介層或控制器
return $next($request);
}
可以在路由中使用 Middleware 來限制訪問權限。
像是工作識別證!
先前使用 JWT 已經有一個 Middleware 是登入驗證:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
將這個登入驗證的 Middleware 變成一個大圈圈組別,也代表所有登入的一般會員,裡面有一個小圈圈是管理員。
use App\Http\Middleware\RoleMiddleware;
Route::middleware('auth:api')->group(function () {
// 所有登入的會員都可以查看所有或特定產品資料、關鍵字搜尋
Route::get('products', [ProductController::class, 'index']);
Route::get('products/{product}', [ProductController::class, 'show']);
// 只有管理員可以進行新增操作
Route::post('products', [ProductController::class, 'store'])->middleware(\App\Http\Middleware\RoleMiddleware::class . ':管理員');
// 只有管理員可以進行更新操作
Route::patch('products/{product}', [ProductController::class, 'update'])->middleware(\App\Http\Middleware\RoleMiddleware::class . ':管理員');
// 只有管理員可以進行刪除操作
Route::delete('products/{product}', [ProductController::class, 'destroy'])->middleware(\App\Http\Middleware\RoleMiddleware::class . ':管理員');
});
打開 MySQL Workbench 將其中一個帳號手動調整權限為「管理員」。
UPDATE users SET role = '管理員' WHERE id = [user_id];
選擇 Bearer Token:{{token}}
按下 Send 後:
{
"id": 1,
"name": "Test User1",
"email": "test2@example.com",
"email_verified_at": null,
"role": "一般會員",
"created_at": "2024-08-27 15:16",
"updated_at": "2024-08-27 15:16"
}
選擇 Bearer Token:{{token}}
按下 Send 後:
{
"id": 2,
"name": "Test User2",
"email": "test2@example.com",
"email_verified_at": null,
"role": "管理員",
"created_at": "2024-08-27 15:18",
"updated_at": "2024-08-27 15:18"
}