Промежуточное программное обеспечение Laravel: обработка нескольких ролей с примерами

В 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
});