J'essaie actuellement de modifier la fonctionnalité de mot de passe de mon profil utilisateur, toutes mes entrées sont soumises au contrôleur, mais je pense qu'il y a peut-être un problème avec ma logique de fonction?
La demande de vidage sur la fonction et le vidage ont été renvoyés avec succès. Mais lors de l'encapsulation d'une variable de validation autour d'un processus de validation, le vidage n'était pas renvoyé. La demande est redirigée vers la page de profil contenant les données du formulaire.
Contrôleur
<form method="POST" action="{{ route('update-password') }}"> @csrf @method('PUT') <div class="form-group row"> <label for="old_password" class="col-md-2 col-form-label">{{ __('Current password') }}</label> <div class="col-md-6"> <input id="old_password" name="old_password" type="password" class="form-control" required autofocus> </div> </div> <div class="form-group row"> <label for="new_password" class="col-md-2 col-form-label">{{ __('New password') }}</label> <div class="col-md-6"> <input id="new_password" name="new_password" type="password" class="form-control" required autofocus> </div> </div> <div class="form-group row"> <label for="password_confirm" class="col-md-2 col-form-label">{{ __('Confirm password') }}</label> <div class="col-md-6"> <input id="password_confirm" name="password_confirm" type="password" class="form-control" required autofocus> </div> </div> <div class="form-group login-row row mb-0"> <div class="col-md-8 offset-md-2"> <button type="submit" class="btn btn-primary"> {{ __('Submit') }} </button> </div> </div> </form>
Afficher
public function updatePassword(Request $request) { $this->validate($request, [ 'old_password' => 'required', 'new_password' => 'required|confirmed', 'password_confirm' => 'required' ]); $user = User::find(Auth::id()); if (!Hash::check($request->current, $user->password)) { return response()->json(['errors' => ['current' => ['Current password does not match']]], 422); } $user->password = Hash::make($request->password); $user->save(); return $user; }
Le résultat devrait renvoyer un message d'erreur 422 / au moins dans la console lorsque le 'Mot de passe actuel' est incorrect, pas simplement rediriger vers la vue et lorsque le mot de passe est correct, puis retourner 200 / message de réussite (pas encore implémenté) à console ou à afficher.
3 Réponses :
Vous validez les champs de demande old_password
, new_password
et password_confirm
ici:
if (!Hash::check($request->current, $user->password)) { // ... $user->password = Hash::make($request->password);
cependant vous êtes en utilisant les champs de requête current
et password
pour vérifier le mot de passe actuel et en définir un nouveau:
$this->validate($request, [ 'old_password' => 'required', 'new_password' => 'required|confirmed', 'password_confirm' => 'required' ]);
Champs validés et champs utilisés devrait être le même.
essayez ceci
public function updatePassword(Request $request){ if (!(Hash::check($request->get('old_password'), Auth::user()->password))) { // The passwords not matches //return redirect()->back()->with("error","Your current password does not matches with the password you provided. Please try again."); return response()->json(['errors' => ['current'=> ['Current password does not match']]], 422); } //uncomment this if you need to validate that the new password is same as old one if(strcmp($request->get('old_password'), $request->get('new_password')) == 0){ //Current password and new password are same //return redirect()->back()->with("error","New Password cannot be same as your current password. Please choose a different password."); return response()->json(['errors' => ['current'=> ['New Password cannot be same as your current password']]], 422); } $validatedData = $request->validate([ 'old_password' => 'required', 'new_password' => 'required|string|min:6|confirmed', ]); //Change Password $user = Auth::user(); $user->password = Hash::make($request->get('new_password')); $user->save(); return $user; }
Essayé, les conditions fonctionnent parfaitement, mais une fois entré le mot de passe correct dans l'entrée old_password et le nouveau mot de passe correspond au nouveau, je reçois à nouveau la redirection 302 et le mot de passe est toujours le même.
Mon mauvais, tout fonctionne maintenant. Nécessaire pour gérer correctement les erreurs. Merci pour cet extrait!
Incluez cette fonction dans un contrôleur:
public function updatePassword(Request $request) { $request->validate([ 'password' => 'required', 'new_password' => 'required|string|confirmed|min:6|different:password' ]); if (Hash::check($request->password, Auth::user()->password) == false) { return response(['message' => 'Unauthorized'], 401); } $user = Auth::user(); $user->password = Hash::make($request->new_password); $user->save(); return response([ 'message' => 'Your password has been updated successfully.' ]); }
N'oubliez pas d'envoyer new_password_confirmation
comme paramètre également, car lorsque nous utilisons la règle de validation confirmée
pour new_password
par exemple, Laravel recherche automatiquement un paramètre appelé new_password_confirmation
afin de comparer les deux champs. p>
Cette réponse m'aide beaucoup ... mais je change return response (['message' => 'Unauthorized'], 401);
en throw ValidationException :: withMessages (['password' => 'Unauthorized']);
parce que je dois montrer à l'utilisateur que le mot de passe actuel est incorrect, et une autre réponse de retour pour rediriger avec un message de réussite.