2016-06-01 35 views
8

io ho creato il percorso della password, visualizzare e metodo nella [email protected] e [email protected]Come convalidare la conferma della password corrente, nuova e nuova in Laravel 5?

Al momento, se compilo il campo new_password, ottiene hash e sottoposto al database in modo corretto, allora posso effettuare il login con la nuova password .

Ma devo essere in grado di convalidare lo new_password e new_password_confirm per verificare che siano uguali e convalidare anche la password corrente dell'utente.

Come posso farlo?

MODIFICA: ho aggiunto $this->validate al metodo, ma ora continuo a ricevere l'errore The password confirmation confirmation does not match. anche se corrispondono mentre sto usando una password semplice. Inoltre, penso che ho bisogno di verificare la password corrente manualmente come validator non lo farà per me.

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(); 
} 

E questa è la vista

<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> 

risposta

29

C'è una funzione Hash::check() che consente di verificare se la vecchia password inserita dall'utente è corretta o meno.

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 

tornerà vero se vecchia password è stata inserita correttamente ed è possibile aggiungere la logica conseguenza

per new_password e new_confirm_password ad essere lo stesso, puoi aggiungere la tua convalida in modulo di richiesta come

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

Grazie per questi suggerimenti utili. Stavo usando 'confirmation' invece di' same: new_password' - l'ho appena cambiato e ha funzionato. E userò il 'Hash :: check()' per convalidare la password corrente. – Halnex

+0

contento che abbia aiutato :) – Sid

+6

Un altro buon trucco da utilizzare nel campo di conferma: la regola di convalida 'confermata' <[link] (https://laravel.com/docs/5.4/validation#rule-confirmed)>. La tua regola attuale sarebbe solo una riga, come questa: ''new_password' => 'richiesto | confermato''. E il nome del campo di conferma dovrebbe essere 'new_password_confirmation'. – Corner

3

È possibile aggiungere confirmed come è per confermare o d password. E 'required|confirmed' si passa a 'required|same:password' per confrontare password e password confirmation

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

Buona fortuna!

+2

La conferma in fase di validazione deve avere un campo corrispondente di foo_confirmation. Ad esempio, se il campo in fase di validazione è password, nell'input deve essere presente un campo password_confirmation corrispondente. –

+0

Questo è sbagliato secondo la documentazione: https://laravel.com/docs/5.1/validation#rule-confirmed – Jonjie

0

È possibile eseguire questa operazione creando una regola di convalida personalizzata (per questo esempio sto utilizzando e new_password come nomi di input).

mettere questo in AppServiceProvider::boot():

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

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

Ora è possibile utilizzare il seguente nel controller:

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

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