Невозможно успешно войти в систему с помощью специальной защиты в Laravel - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь создать новый тип входа в систему, который работает вместе с таблицей users с именем business_users.

Я добавил связанные таблицы, модели и конфигурацию в свои файлы auth. php .

Модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;

class BusinessUser extends Authenticatable
{
    protected $fillable = ['first_name', 'last_name', 'email', 'password', 'username'];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $guard = 'business_user';

    public function business()
    {
        return $this->belongsTo('App\Business');
    }

    public function username()
    {
        return 'username';
    }

    public function getAuthPassword()
    {
        return $this->password;
    }

}

авторизация php

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

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],
...
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

     'business_users' => [
         'driver' => 'eloquent',
         'model' => App\BusinessUser::class,
     ],
],

Маршрут (который подделывает логин для тестирования)

Route::get('/business/fake-login', function () {

    $user = \App\BusinessUser::first();

    if (Auth::guard('business_user')->attempt(['username' => $user->username, 'password' => $user->password])) {
        return redirect()->intended('/business/dashboard');
    }

});

Я пытаюсь использовать business.username и business.password для входа в систему, но приведенное выше условие Auth: guard возвращает false.

Может ли кто-нибудь объяснить, что я делаю неправильно?

(к вашему сведению, я использую Laravel 7.x)

1 Ответ

0 голосов
/ 21 июня 2020

Вы извлекаете $user из базы данных, пароль зашифрован.

Auth::attempt() зашифрует пароль для вас, поэтому в части проверки пароля ваш пароль фактически шифруется дважды.

Вместо этого вы можете использовать Auth:attempt() следующим образом:

$res = Auth::guard('business_guard')->attempt([
   'username' => "test",
   'password' => "test",
]);

dd( $res );

Чтобы понять больше, вы можете go на EloquentUserProvider.php

public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];
    return $this->hasher->check($plain, $user->getAuthPassword());
}

Использовать исходный код и dd() $plain, чтобы узнать, что происходит.

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