Как сделать авторизацию через другую модель?

В Laravel авторизация по умолчанию осуществляется через модель "User", однако, иногда требуется авторизация через другую модель. Это может быть полезно, например, когда у вас есть модель "Admin", которая отличается от модели "User" и используется для авторизации администраторов.

Для того чтобы сделать авторизацию через другую модель в Laravel, следуйте следующим шагам:

1. Создайте новую модель, которую вы будете использовать для авторизации. К примеру, "Admin". Для создания новой модели в Laravel вы можете использовать команду Artisan: php artisan make:model Admin.

2. Внесите соответствующие изменения в новую модель "Admin". Убедитесь, что ваша модель "Admin" наследует класс "Authenticatable". Ваш класс "Admin" должен выглядеть примерно так:

use IlluminateContractsAuthAuthenticatable;
use IlluminateDatabaseEloquentModel;

class Admin extends Model implements Authenticatable
{
    use IlluminateAuthAuthenticatableTrait;

    // ...
}

3. Теперь нужно настроить, как Laravel будет использовать вашу новую модель "Admin" для авторизации. Для этого откройте файл config/auth.php. В этом файле найдите массив providers и измените значение model на вашу новую модель "Admin". В итоге это должно выглядеть примерно так:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppModelsAdmin::class,
    ],
],

4. Теперь необходимо указать настройки гвардов в файле config/auth.php. Добавьте новый гвард, например, "admin". Настройте его как показано ниже:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
],

5. Во вкладке "providers" файла config/auth.php добавьте нового провайдера "admins", который будет использоваться для проведения аутентификации:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppModelsUser::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => AppModelsAdmin::class,
    ],
],

6. Далее вам нужно указать новый гвард по умолчанию в файле app/Http/Kernel.php. Найдите свойство $routeMiddleware и добавьте новый элемент в массив, например, 'auth.admin':

protected $routeMiddleware = [
    // ...

    'auth.admin' => AppHttpMiddlewareAuthenticateAdmin::class,
],

7. Создайте новый middleware, в котором будет проверяться аутентификация администратора. Выполните команду Artisan, чтобы создать новый middleware: php artisan make:middleware AuthenticateAdmin.

8. Откройте только что созданный middleware app/Http/Middleware/AuthenticateAdmin.php и добавьте следующий код:

public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('login');
    }

    return $next($request);
}

9. Далее вам нужно создать маршруты для аутентификации администраторов. Откройте файл routes/web.php и добавьте следующий код:

Route::group(['middleware' => 'auth.admin'], function () {
    // Ваши маршруты для авторизованных администраторов здесь
});

Теперь у вас должна быть настроена авторизация через другую модель "Admin". При попытке доступа к маршрутам, требующим аутентификации администратора, Laravel будет использовать модель "Admin" для проверки и проведения аутентификации.