Как указать дополнительное условие при аутентификации?

При использовании фреймворка Laravel для аутентификации пользователей, можно указать дополнительное условие при проверке учетных данных.

Laravel предлагает гибкую систему аутентификации, основанную на драйвере "guards". Guard - это механизм проверки подлинности, который определяет, какую модель пользователя и таблицу использовать для аутентификации.

Для того чтобы указать дополнительное условие при аутентификации, вам необходимо создать свой собственный Guard, который будет наследоваться от класса IlluminateAuthSessionGuard или IlluminateAuthTokenGuard.

Для примера, предположим, что у вас есть модель User с атрибутом is_verified, который указывает, был ли пользователь подтвержден или нет. Вам нужно проверить это условие при аутентификации.

Сначала создайте класс VerifiedGuard, который будет наследоваться от SessionGuard:

namespace AppAuth;

use IlluminateAuthSessionGuard;
use IlluminateContractsAuthUserProvider;
use IlluminateHttpRequest;

class VerifiedGuard extends SessionGuard
{
    public function __construct(UserProvider $provider, Request $request)
    {
        parent::__construct($provider, $request);
    }

    // Метод для проверки дополнительного условия
    protected function hasVerified($user)
    {
        return $user->is_verified;
    }

    // Переопределение метода аутентификации
    public function attempt(array $credentials = [], $remember = false)
    {
        $user = parent::attempt($credentials, $remember);

        if ($user && $this->hasVerified($user)) {
            $this->login($user, $remember);
            return true;
        }

        return false;
    }
}

В данном примере, метод attempt переопределен, чтобы проверить, соответствует ли пользователь дополнительному условию hasVerified. Если проверка проходит успешно, вызывается метод login, который устанавливает сеанс аутентификации.

Затем зарегистрируйте ваш Guard в файле config/auth.php, заменив session на verified:

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

    // Другие группы Guard...
],

// В резделе 'providers' укажите ваш провайдер пользователей...

Теперь, при использовании маршрутов, защищенных аутентификацией, Laravel будет использовать ваш свежесозданный Guard для проверки дополнительного условия.