J'ai créé l'itinéraire, la vue et la méthode de mot de passe dans UserController@getProfilePassword
et UserController@postProfilePassword
Pour le moment, si je remplis le champ new_password
, il est correctement haché et soumis à la base de données, je peux alors me connecter avec le nouveau mot de passe.
Mais je dois pouvoir valider les new_password
et new_password_confirm
pour m'assurer qu'ils sont identiques et valider le mot de passe actuel de l'utilisateur.
Comment puis je faire ça?
EDIT: J'ai ajouté $this->validate
à la méthode, mais je continue à avoir l'erreur The password confirmation confirmation does not match.
même si elles correspondent, car j'utilise un mot de passe simple. De plus, je pense que je dois vérifier manuellement le mot de passe actuel, car validator
ne le fera pas pour moi.
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();
}
Et c'est la vue
<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>
Il existe une fonction Hash::check()
qui vous permet de vérifier si l'ancien mot de passe saisi par l'utilisateur est correct ou non.
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
il retournera true si l'ancien mot de passe a été entré correctement et vous pouvez ajouter votre logique en conséquence
pour que new_password
et new_confirm_password
soient identiques, vous pouvez ajouter votre demande de validation dans le formulaire, comme
'new_password' => 'required',
'new_confirm_password' => 'required|same:new_password'
Vous pouvez le faire en créant une règle de validation personnalisée (pour cet exemple, j'utilise current_password
et new_password
comme noms d'entrée).
Mettez ceci dans AppServiceProvider::boot()
:
Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) {
$user = User::find($parameters[0]);
return $user && Hash::check($value, $user->password);
});
Vous pouvez maintenant utiliser les éléments suivants dans votre contrôleur:
$user = auth()->user(); // or pass an actual user here
$this->validate($request, [
'current_password' => 'required_with:new_password|current_password,'.$user->id,
]);
Vous pouvez ajouter confirmed
pour confirmer l'ancien mot de passe . Et 'required|confirmed'
vous passez à 'required|same:password'
pour comparer password
et password confirmation
'old_password' => 'required|confirmed',
'password' => 'required|min:4',
'password_confirmation' => 'required|same:password'
Bonne chance!
Si vous n'avez besoin des fonctionnalités d'une règle personnalisée qu'une seule fois dans votre application, vous pouvez utiliser un objet Closure au lieu d'un objet de règle. La fermeture reçoit le nom de l'attribut, sa valeur et un rappel $ fail à appeler si la validation échoue
$request->validate([
'new_password' => 'required|confirmed|min:4',
'current_password' => ['required', function ($attribute, $value, $fail) use ($user) {
if (!\Hash::check($value, $user->password)) {
return $fail(__('The current password is incorrect.'));
}
}],
]);
Une fonction complète qui va tout vérifier. Il vous suffit d’envoyer old_password
, new_password
et confirm_password
.
public function changePassword(Request $request) {
try {
$valid = validator($request->only('old_password', 'new_password', 'confirm_password'), [
'old_password' => 'required|string|min:6',
'new_password' => 'required|string|min:6|different:old_password',
'confirm_password' => 'required_with:new_password|same:new_password|string|min:6',
], [
'confirm_password.required_with' => 'Confirm password is required.'
]);
if ($valid->fails()) {
return response()->json([
'errors' => $valid->errors(),
'message' => 'Faild to update password.',
'status' => false
], 200);
}
// Hash::check("param1", "param2")
// param1 - user password that has been entered on the form
// param2 - old password hash stored in database
if (Hash::check($request->get('old_password'), Auth::user()->password)) {
$user = User::find(Auth::user()->id);
$user->password = (new BcryptHasher)->make($request->get('new_password'));
if ($user->save()) {
return response()->json([
'data' => [],
'message' => 'Your password has been updated',
'status' => true
], 200);
}
} else {
return response()->json([
'errors' => [],
'message' => 'Wrong password entered.',
'status' => false
], 200);
}
} catch (Exception $e) {
return response()->json([
'errors' => $e->getMessage(),
'message' => 'Please try again',
'status' => false
], 200);
}
}