在中间件文件的末尾,你应该始终使用return $next($request);
... 这些示例中有一些没有这样做。
以下是你的路由将会是这样的(web.php 文件):
Route::middleware('auth')->group(function () {
Route::middleware('CheckRole:super-admin')->group(function () {
});
Route::middleware('CheckRole:user')->group(function () {
});
});
要在上面的代码中添加更多角色,只需将
CheckRole:super-admin,user
放在逗号后面,以便为特定组继续添加角色。
下面的中间件将自动阻止没有权限的任何人进入上面指定的区域,只有在用户登录时才能进入。
请确保将下面的中间件添加到:
App\Http\Kernel.php
在`protected $middlewareAliases = [`下面添加以下代码行:
'CheckRole' => \App\Http\Middleware\CheckRole::class,
您的中间件将是:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class CheckRole
{
public function handle(Request $request, Closure $next, ...$roles): Response
{
if ($request->user()) {
$userRole = Auth::user()->role->value('name');
if (! in_array($userRole, $roles)) {
abort(403, 'Your account permissions do not allow access to the requested page');
}
}
return $next($request);
}
}
这假设您每个用户只有一个角色。如果一个用户有多个角色,那么在中间件代码中需要进行不同的检查。
如果您有多个用户拥有多个角色,您可以使用这个中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class CheckRole
{
public function handle(Request $request, Closure $next, ...$roles): Response
{
if ($request->user()) {
$userRoles = Auth::user()->roles
->pluck('name')
->toArray();
if (! array_intersect($userRoles, $roles)) {
abort(403, 'Your account permissions do not allow access to the requested page');
}
}
return $next($request);
}
}