根据用户列值保护 Laravel 9 中的路由

Protect Route in Laravel 9 Based on User Column Value

我的 User table 中有一个名为 role 的列,其中包含 2 个可能的值——“Admin”和 “Driver”。

我所有的 crud 路由都受到 Auth 中间件的保护,但我想进一步保护其中一些路由。

例如,我希望“创建”路由只能由角色列等于“管理员”的用户访问。
我不确定该怎么做,所以我无法提供我尝试过的示例。

web.php

...
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/users', App\Http\Livewire\User\Index::class)->name('users.index');
    Route::get('/user/{user}/edit', App\Http\Livewire\User\Edit::class)->name('user.edit');

    /* This is the route I want to protect to just "Admin" role */
    Route::get('/user/create', App\Http\Livewire\User\Create::class)->name('user.create');
...

您可以使用 artisan 命令创建中间件

php artisan make:middleware IsAdminMiddleware

然后在中间件的 handle 函数中添加类似的内容。

public function handle(Request $request, Closure $next)
{
  // This validation assumes you can access role from User Model
  if ($request->user()->role != "Admin") {
     return response()->json(['error' => 'you are not an admin!'], 403);
  }

  return $next($request);
}

最后在你的路由

上添加中间件
Route::get('/user/create', App\Http\Livewire\User\Create::class)
  ->middleware(IsAdminMiddleware::class) // <<----
  ->name('user.create');

有关详细信息,请参阅 laravel 上的 middleware the docs

您可以针对您的案例使用 laravel 中的授权

在 laravel 中,您可以使用 gate 或 policy 获得更多功能

https://laravel.com/docs/9.x/authorization

大门

在 App\Providers\AuthServiceProvider 方法启动时定义门

use Illuminate\Support\Facades\Gate;
use Illuminate\Auth\Access\Response;
use App\Models\User;
/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();
 
    Gate::define('create', function (User $user) {
        return ($user->role == 'Admin')
            ? Response::allow()
            : Response::deny('You must be an administrator.');
    });
}

在你的控制器上

<?php
 
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
 
class CreateController extends Controller
{
    public function create(Request $request)
    {
        $user = Auth::user();
        if (Gate::allows('create', $user)) {
            //create 
        }

    }
}