Как проверить проверку текущего пароля в Laravel 5.8

#laravel #tdd

#laravel #tdd

Вопрос:

Я пытаюсь проверить, совпадает ли текущий пароль с тем, что указан в DB.

мой упрощенный контроллер:

 class ChangePasswordController extends Controller
{
    public function update(Request $request, User $user)
    {
        $this->validate($request, [
            'current_password' => ['required', new CurrentPassword()],
            'password' => 'required|string|min:6|confirmed'
        ]);

        $user->update([
            'password' => bcrypt($request->password)
        ]);

    }
}
  

в моем пользовательском правиле CurrentPassword я проверяю хэш следующим образом:

 class CurrentPassword implements Rule
{

    public function passes($attribute, $value)
    {
        $check = Hash::check($value, auth()->user()->password);
        dump($check);
        return $check;
    }


    public function message()
    {
        return 'Current password is incorrect.';
    }
}
  

и мой тест для пользовательского правила:

 /** @test */
public function an_authenticated_user_may_change_own_password()
{
    $this->withoutExceptionHandling();

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

    $this->actingAs($user)->patch("/profile/{$user->id}/password", [
        'current_password' => '1234',
        'password' => 'mynewpassword',
        'password_confirmation' => 'mynewpassword'
    ]);

    $this->assertTrue(Hash::check('mynewpassword', $user->fresh()->password));
}    
  

к сожалению, я получаю сообщение об ошибке:

1) Тесты Feature UpdatePasswordTest::an_authenticated_user_may_change_own_password Освещают Validation ValidationException: данные данные были недействительными.

я не понимаю, почему это происходит. Мой dump($check); возвращает false при запуске этого теста. Мое значение $ равно ‘1234’, а auth()-> user()->password также возвращает ‘1234’. Может быть, у кого-нибудь есть идея, что я делаю неправильно.

этот тест становится зеленым:

  /** @test */
    public function current_password_must_be_valid()
    {
        $user = factory(User::class)->create([
            'password' => '1234'
        ]);

        $this->actingAs($user)->patch("/profile/{$user->id}/password", [
            'current_password' => '12345',
            'password' => 'mynewpassword',
            'password_confirmation' => 'mynewpassword'
        ])->assertSessionHasErrors('current_password');

    }
  

Ответ №1:

Вы также должны хэшировать свой пароль на своей фабрике, иначе Eloquent сохранит его в виде открытого текста (вот почему auth()->user()->password возвращает ‘1234’)

 public function current_password_must_be_valid()
{
    $user = factory(User::class)->create([
        'password' => Hash::make('1234'); // remember to import the Hash facade
    ]);

    ...
}
  

Комментарии:

1. Я обновил свой тест, но я все еще становлюсь красным. "$2y$04$C8lenwCy6SwJqFsuEcw0LOQpo/jeqGOCkgys2i/NUWzsaBuE3kVTW" "$2y$04$C8lenwCy6SwJqFsuEcw0LOQpo/jeqGOCkgys2i/NUWzsaBuE3kVTW" false . Это мои дампы ($value // auth()-> user()->password // Hash::check) в пользовательском правиле.

2. Hash::check будет проверяться обычный текст, поэтому $value должен быть открытый текст. В вашем случае кажется, что вы его хэшировали (поэтому он будет хэшировать хэш), так что, на всякий случай, это должно пройти: Hash::check('1234', auth()->user()->password) в вашем пользовательском правиле, верно?

3. вы правы. Значение $ также было хэшировано, и поэтому тест был красным. Спасибо!