Пароль BCrypt не совпадает при смене через Mutator Laravel 5.4

У меня есть проект Laravel 5.4, в котором я пытаюсь запустить простой интеграционный тест, который проверяет, может ли пользователь войти в систему должным образом, для этого я генерирую нового пользователя через Factory.

    $user = factory(User::class)->create(['password' =>'secret']);

Тогда в моем тесте

    $this->visitRoute('admin.login')
->submitForm('LOGIN', ['email' => $user->email, 'password' => 'secret'])
->seeIsAuthenticated()
->seeStatusCode(200);

Пользователь никогда не аутентифицируется, я могу подтвердить, что $ user-> email совпадает с адресом в БД, но пароль никогда не делает …

Поэтому я проверил хэш, который он сгенерировал в БД, с помощью «секретной» строки на этом сайте. https://www.dailycred.com/article/bcrypt-calculator

Я получаю сообщение об ошибке invalid salt revision я озадачен, о чем это все?
Я хеширую пароль через мутатор, который выглядит так

public function setPasswordAttribute($value) {
$this->attributes['password'] = bcrypt($value);
}

Согласно совету, который уже дан в одном из комментариев ниже, я попробовал следующее решение

    $hasher = new BcryptHasher();
$hash = $hasher->make($value);

$this->attributes['password'] = $hash;

Через xDebug я могу сказать, что он входит в метод make () дважды, один раз при инициализации перед вызовом Mutator, и отправляет случайный набор символов в этот момент, затем он запускает мутатор и команду make () со строкой secret как и ожидалось, я извлекаю хэш, который он генерирует, и нахожу ту же проблему … invalid salt revision

0

Решение

Я использую этот мутатор в своей модели User, и пароль автоматически хешируется, только если это необходимо:

public function setPasswordAttribute($value)
{
if( \Hash::needsRehash($value) ) {
$value = \Hash::make($value);
}
$this->attributes['password'] = $value;
}
0

Другие решения

Я выяснил проблему, это было глупо, поэтому в моем LoginController я проверял, установлен ли у пользователя активный флаг вместе с адресом электронной почты и паролем …

protected function attemptLogin(Request $request)
{
return Auth::attempt([
'email' => $request->input('email'),
'password' => $request->input('password'),
'active' => 1
]);
}

По сути, у моей фабрики есть правило 50/50 относительно флага ‘active’, поэтому всякий раз, когда сгенерированный пользователь имеет активный флаг = 1, он будет работать, остальные 50% времени он будет выходить из строя.

Извините, но спасибо за вашу помощь всем, надеюсь, это поможет кому-то в будущем 🙂

0

По вопросам рекламы [email protected]