根据用户列值保护 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
}
}
}
我的 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
}
}
}