Метод Illuminate \ Auth \ RequestGuard :: попытки не существует.при попытке пользовательской аутентификации через веб-маршрут - PullRequest
0 голосов
/ 21 февраля 2019

Я должен аутентифицировать пользователей с помощью внешнего API (что-то вроде ldap) и пытался реализовать аутентификацию с помощью защиты запроса закрытия, как описано здесь https://laravel.com/docs/master/authentication#closure-request-guards

Работает нормально, если пользовательрегистрируется правильно, однако при сбое аутентификации laravel выдает указанную ошибку https://laravel.com/docs/master/authentication#closure-request-guards, если неудачная попытка возвращает null из замыкания (как сказано в документации).Если он просто возвращает false, laravel не выдает ошибку, однако нет подтверждения обратной связи.


Auth::viaRequest('ldap', function ($request) {

  $credentials = $request->only('login_id', 'password');
  if ($user = ExternalLDPAAuth::auth()) {
    return $user;
  } else {
    return null;   // laravel throws error

    // return false;   // <- would not throw error, but no validation
  }

}

Есть ли более простой способ сделать пользовательскую аутентификацию?
Я не совсем понимаюдокументация о https://laravel.com/docs/5.7/authentication#authenticating-users, в конце концов, я все равно должен написать охрану, как и выше, верно?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

В итоге я решил настроить EloquentUserProvider вместо охранника.В конце концов, все, что мне было нужно, это дополнительная логика для проверки учетных данных и извлечения пользователя по учетным данным, если пользователь еще не вошел в систему.Т.е. сначала проверяется нормальная красноречивая логика, а затем проверяется по внешнему API, если ничего не найдено (также проверяется случай изменения пароля).

class CustomUserProvider extends EloquentUserProvider
{
    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        // (...)
    }

    /**
     * Retrieve a user by the given credentials.
     *
     * @param  array  $credentials
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveByCredentials(array $credentials)
    {
        // (...)
    }

}


// config/auth.php
'guards'    => [
        'web' => [
            'driver'   => 'session',
            'provider' => 'custom',
        ],
        // (...)
    ],


// providers/AuthServiceProvider.php

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Auth::provider('custom', function ($app, array $config) {
            return new CustomUserProvider($app['hash'], $config['model']);
        });
    }

}
0 голосов
/ 21 февраля 2019

Вы не показали код, по которому вы звоните attempt(), но вам не нужно использовать этот метод при аутентификации через запрос.Вы используете attempt(), когда пользователь пытается войти с учетными данными, и вам необходимо явно попытаться пройти аутентификацию.При аутентификации запроса Laravel будет автоматически пытаться аутентифицироваться при обработке запроса, поэтому ваш код может просто проверить, возвращает ли auth()->check() истину или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...