2
votes

Laravel 5.8 Modifier la fonctionnalité de mot de passe

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.


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

7
votes

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


2 commentaires

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!



1
votes

Laravel 5.8

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>


1 commentaires

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.