web-dev-qa-db-fra.com

Changer le mot de passe dans Laravel 5.4

J'ai ajouté du code pour changer le mot de passe dans mon application Web. Mais Hash::check() ne fonctionne pas. Retourne toujours faux. De plus, Hash::Make() renvoie différentes chaînes à chaque fois. J'ai essayé bcrypt() à la place, mais cela ne fonctionne pas non plus. Aidez-moi, s'il vous plaît. Voici mon code.

public function changePassword(Request $request)
{
    $user = Auth::user();

    $curPassword = $request->input['curPassword'];
    $newPassword = $request->input['newPassword'];

    if (Hash::check($curPassword, $user->password)) {
        $user_id = $user->id;
        $obj_user = User::find($user_id)->first();
        $obj_user->password = Hash::make($newPassword);
        $obj_user->save();

        return response()->json(["result"=>true]);
    }
    else
    {
        return response()->json(["result"=>false]);
    }
}

Je vous remercie.

3
Fred Lopes

Je pense que votre variable $ curPassword est vide, c'est pourquoi elle renvoie toujours false. Essayez de cette façon

$curPassword = $request->curPassword;
$newPassword = $request->newPassword;

Sauf si vous envoyez des données dans un tableau input. Mais quelque chose, Hash::check() échoue, ce qui signifie qu'il n'y a pas de correspondance. 

En ce qui concerne la même chaîne, oui, Hash::make() renvoie toujours une chaîne différente. Je suppose que pour des raisons de sécurité. 

4
EddyTheDove

Heres comment je l'ai fait:

Dans mon contrôleur, j'utilise la méthode suivante:

public function changePassword()
{
    $this->validate(request(), [
        'current_password' => 'required|current_password',
        'new_password' => 'required|string|min:6|confirmed',
    ]);

    request()->user()->fill([
        'password' => Hash::make(request()->input('new_password'))
    ])->save();
    request()->session()->flash('success', 'Password changed!');

    return redirect()->route('password.change');
}

Cela validera la saisie, puis sauvegardera correctement le nouveau mot de passe pour l'utilisateur actuel. Il clignote également un message, puis les renvoie au formulaire de modification du mot de passe. Vous pouvez supprimer cette partie et faire votre propre chose là-bas.

Ceci utilise une règle de validation personnalisée que j'ai créée et appelée current_password. Vous devez ajouter ceci à votre méthode AppServiceProvider::boot() comme ceci:

public function boot()
{
    // current password validation rule
    Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) {
        return Hash::check($value, Auth::user()->password);
    });
}

Assurez-vous simplement que vous utilisez les façades Auth, Hash et Validator dans AppServiceProvider.

Enfin, nous devons simplement déclarer notre message d'erreur dans notre fichier lang/en/validation.php:

'current_password' => "The :attribute is invalid.",

J'espère que cela t'aides.

5
kjdion84

CA devrait etre 

 $curPassword =$request->input('curPassword');
 $newPassword = $request->input('newPassword');

ne pas

 $curPassword = $request->input['curPassword'];
 $newPassword = $request->input['newPassword'];

Dans Laravel Documentation ils disent que si vous voulez changer le mot de passe, ce que vous pourriez faire après la vérification est

 $request->user()->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();
1
Amr Aly

Il y a aussi une erreur dans cette ligne

$obj_user = User::find($user_id)->first();

cA devrait etre

$obj_user = User::find($user_id);

Comme le dit la documentation officielle

// Retrieve a model by its primary key...
$flight = App\Flight::find(1);

// Retrieve the first model matching the query constraints...
$flight = App\Flight::where('active', 1)->first();
0
sachin kumar