В Laravel вы можете использовать промежуточное программное обеспечение, чтобы добавить к вашим маршрутам дополнительный уровень фильтрации и аутентификации. Если вы хотите ограничить доступ к определенным маршрутам на основе нескольких ролей, вы можете создать собственное промежуточное программное обеспечение, которое проверяет эти роли. Вот несколько способов добиться этого, а также примеры кода:
Метод 1: использование метода can
Вы можете использовать встроенную функцию авторизации Laravel, которая предоставляет метод canдля проверки наличия у пользователя определенной роли. Используя этот подход, вы можете определить несколько ролей и проверить наличие любой из них.
Сначала определите роли в вашей модели Пользователь:
class User extends Authenticatable
{
use HasRoles;
// ...
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function hasAnyRole($roles)
{
return $this->roles()->whereIn('name', $roles)->exists();
}
}
Затем создайте собственное промежуточное программное обеспечение, которое будет проверять указанные роли:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckRoles
{
public function handle($request, Closure $next, ...$roles)
{
if (Auth::check() && Auth::user()->hasAnyRole($roles)) {
return $next($request);
}
abort(403, 'Unauthorized');
}
}
Чтобы использовать это промежуточное ПО, зарегистрируйте его в классе App\Http\Kernel:
protected $routeMiddleware = [
// ...
'roles' => \App\Http\Middleware\CheckRoles::class,
];
Наконец, примените промежуточное программное обеспечение к вашим маршрутам:
Route::group(['middleware' => ['roles:admin,editor']], function () {
// Routes that require 'admin' or 'editor' roles
});
Метод 2: использование нескольких промежуточных программ
Другой подход — создать отдельное промежуточное программное обеспечение для каждой роли и применить его к вашим маршрутам. Этот метод обеспечивает большую гибкость при индивидуальной обработке логики каждой роли.
Сначала создайте промежуточное ПО для каждой роли:
namespace App\Http\Middleware;
use Closure;
class CheckAdminRole
{
public function handle($request, Closure $next)
{
if (auth()->user()->isAdmin()) {
return $next($request);
}
abort(403, 'Unauthorized');
}
}
namespace App\Http\Middleware;
use Closure;
class CheckEditorRole
{
public function handle($request, Closure $next)
{
if (auth()->user()->isEditor()) {
return $next($request);
}
abort(403, 'Unauthorized');
}
}
Зарегистрируйте промежуточное ПО в классе App\Http\Kernel:
protected $routeMiddleware = [
// ...
'admin' => \App\Http\Middleware\CheckAdminRole::class,
'editor' => \App\Http\Middleware\CheckEditorRole::class,
];
Примените промежуточное программное обеспечение к своим маршрутам:
Route::group(['middleware' => ['admin|editor']], function () {
// Routes that require 'admin' or 'editor' roles
});