web-dev-qa-db-fra.com

Comment valider la confirmation du mot de passe actuel, nouveau et nouveau dans Laravel 5?

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

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'
39
Sid

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,
]);
3
kjdion84

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!

2
Sanji

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.'));
        }
    }],
]);

https://laravel.com/docs/5.6/validation#using-closures

2
Steve

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);
            }
        }
0
PHP Worm...