2016-06-01 16 views
8

ja stworzyliśmy trasy hasło, przeglądanie i metody w [email protected] i [email protected]Jak sprawdzić aktualne, nowe i nowe potwierdzenie hasła w Laravel 5?

w tej chwili, gdybym wypełnić pole new_password, zostaje zakodowane i przekazane do bazy danych poprawnie, wtedy mogę się zalogować z nowym hasłem .

Ale muszę mieć możliwość sprawdzenia poprawności new_password i new_password_confirm, aby upewnić się, że są takie same i potwierdzić aktualne hasło użytkownika.

Jak mogę to zrobić?

EDYCJA: Dodałem $this->validate do metody, ale teraz nadal otrzymuję błąd The password confirmation confirmation does not match., mimo że pasują one, ponieważ używam prostego hasła. Myślę również, że muszę ręcznie sprawdzić bieżące hasło, ponieważ validator nie zrobi tego za mnie.

public function getProfilePassword(Request $request) { 
    return view('profile/password', ['user' => Auth::user()]); 
} 

public function postProfilePassword(Request $request) { 
    $user = Auth::user(); 

    $this->validate($request, [ 
     'old_password'   => 'required', 
     'password'    => 'required|min:4', 
     'password_confirmation' => 'required|confirmed' 
    ]); 

    $user->password = Hash::make(Input::get('new_password')); 
    $user->save(); 
} 

A to jest widok

<form action="{{ route('profile/updatepassword') }}" method="post" enctype="multipart/form-data"> 
    <div class="form-group"> 
      <label for="name">Current Password</label> 
      <input type="password" name="old_password" class="form-control" id="old_password"> 
    </div> 
    <div class="form-group"> 
      <label for="name">Password</label> 
      <input type="password" name="password" class="form-control" id="password"> 
    </div> 
    <div class="form-group"> 
      <label for="name">New Password</label> 
      <input type="password" name="password_confirmation" class="form-control" id="password_confirmation"> 
    </div> 
    <button type="submit" class="btn btn-primary">Change Password</button> 
    <input type="hidden" value="{{ Session::token() }}" name="_token"> 
</form> 

Odpowiedz

29

Jest Hash::check() funkcja, która pozwala sprawdzić, czy stare hasło wprowadzone przez użytkownika jest prawidłowe, czy nie.

usage

if (Hash::check("param1", "param2")) { 
//add logic here 
} 

param1 - user password that has been entered on the form 
param2 - old password hash stored in database 

zwróci true, jeśli stare hasło zostało wprowadzone poprawnie i można dodać logikę odpowiednio

dla new_password i new_confirm_password być takie same, można dodać walidację w żądaniu formularza jak

'new_password' => 'required', 
'new_confirm_password' => 'required|same:new_password' 
+0

Dziękuję za tych przydatnych wskazówek. Używałem 'potwierdzenie' zamiast' same: new_password' - po prostu zmieniłem to i zadziałało. I będę używał 'Hash :: check()' do sprawdzania aktualnego hasła. – Halnex

+0

Cieszę się, że pomogło :) – Sid

+6

Kolejna dobra sztuczka do użycia w polu potwierdzenia: "potwierdzona" zasada walidacji <[link] (https://laravel.com/docs/5.4/validation#rule-confirmed)>. Twoja aktualna reguła to tylko jedna linia, na przykład: '' new_password '=>' required | confirmed''. A nazwa pola potwierdzającego powinna być "new_password_confirmation". – Corner

3

Możesz dodać confirmed, aby potwierdzić d hasło. I 'required|confirmed' zmianie do 'required|same:password' porównać password and password confirmation

'old_password' => 'required|confirmed', 'password' => 'required|min:4', 'password_confirmation' => 'required|same:password'

Powodzenia!

+2

Potwierdzone w ramach sprawdzania poprawności musi mieć pasujące pole foo_confirmation. Na przykład, jeśli pole sprawdzania poprawności to hasło, w polu wejściowym musi znajdować się pasujące pole password_confirmation. –

+0

To jest złe, zgodnie z dokumentacją: https://laravel.com/docs/5.1/validation#rule-confirmed – Jonjie

0

Możesz to zrobić, tworząc niestandardową regułę sprawdzania poprawności (w tym przykładzie używam current_password i new_password jako nazw wejściowych).

umieścić to w AppServiceProvider::boot():

Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) { 
    $user = User::find($parameters[0]); 

    return $user && Hash::check($value, $user->password); 
}); 

Teraz można użyć następujących w kontrolerze:

$user = auth()->user(); // or pass an actual user here 

$this->validate($request, [ 
    'current_password' => 'required_with:new_password|current_password,'.$user->id, 
]);