Maison  >  Article  >  développement back-end  >  Explication détaillée de l'exemple de réinitialisation de mot de passe Laravel

Explication détaillée de l'exemple de réinitialisation de mot de passe Laravel

*文
*文original
2017-12-29 18:13:271867parcourir

Supposons que vous deviez utiliser Laravel pour créer un système de gestion de contenu backend, mais que l'enregistrement de connexion par défaut de Laravel ne puisse pas répondre aux besoins actuels pour réinitialiser le mot de passe, car il est utilisé dans le backend et il n'est pas nécessaire d'envoyer un e-mail à. réinitialisé, la réinitialisation par défaut est Les mots de passe ne fonctionneront certainement pas. Suivez cet article pour voir comment réinitialiser le mot de passe dans Laravel.

1. Déterminez d'abord l'itinéraire pour réinitialiser le mot de passe

Le mot de passe de réinitialisation généré par défaut lorsque nous installons Laravel est Ceci est effectué lorsque l'utilisateur n'est pas connecté. Par conséquent, il n'est pas possible d'utiliser le contrôleur d'origine, et le mot de passe de réinitialisation d'origine n'a pas besoin de vérifier si le mot de passe d'origine est correct, mais modifie directement le mot de passe par e-mail, donc pour la méthode du contrôleur, nous devons également le réécrire. Nous créons une classe de contrôleur en utilisant php artisan make:controller UserController, puis créons deux routes Route::get('reset', 'UserController@getReset') et Route::post('reset', 'UserController@postReset').

La première est une demande d'obtention pour réinitialiser le mot de passe, suivie d'une demande de publication pour réinitialiser le mot de passe.

2. Afficher la page de réinitialisation du mot de passe

Cela utilise la méthode getReset, cette méthode uniquement Une vue doit être affiché afin qu'il n'y ait pas de logique particulière


public function getReset()
{
  return view('auth.reset');
}

Demande de réinitialisation du mot de passe

Ceci utilise la méthode postReset. Pour recevoir des données, nous pouvons utiliser deux méthodes pour recevoir les données transmises : L'une consiste à utiliser la méthode de requête pour recevoir des données , L'autre consiste à utiliser la méthode Input::get pour obtenir des données. Si Request a besoin d'introduire la classe use IlluminateHttpRequest, si Input a besoin d'introduire la classe use Input, ici nous choisissons d'utiliser request pour recevoir.

4. Règles de vérification

Pour la vérification, laravel nous fournit un ensemble de règles de vérification, utilisez les validator de Validator::make(). Méthode pour vérifier que

$data = $request->all(); //接收所有的数据
$rules = [
  'oldpassword'=>'required|between:6,20',
  'password'=>'required|between:6,20|confirmed',
];
$messages = [
  'required' => '密码不能为空',
  'between' => '密码必须是6~20位之间',
  'confirmed' => '新密码和确认密码不匹配'
];
$validator = Validator::make($data, $rules, $messages);

$data reçoit les informations de données transmises depuis

rules juge la valeur reçue, où le oldpassword et devant le tableau password sont les données du champ de nom du mot de passe d'origine et du nouveau mot de passe reçus du front-end pour vérification

Les règles de vérification sont disponibles dans le chapitre de vérification du manuel. est utilisé Il s'agit de faire le même jugement entre le nouveau mot de passe et le mot de passe confirmé. La valeur de nom requise pour le mot de passe confirmé doit être la valeur de nom du nouveau mot de passe suivie de '_confirmation' Par exemple, si la valeur de nom de. le nouveau mot de passe est newpassword, la valeur du nom du mot de passe confirmé est Il doit être newpassword_confirmation pour déterminer quelle invite messages sera affichée pour la demande de données vérifiées.

Après avoir réussi la vérification ci-dessus, il existe une autre situation qui n'est pas vérifiée, à savoir si le mot de passe d'origine saisi est le même que le mot de passe d'origine dans la base de données.

Ici, nous pouvons d'abord vérifier les informations de l'utilisateur dans la base de données, puis les comparer avec le mot de passe d'origine saisi. Ici, nous utilisons Auth::user() pour obtenir des informations sur l'utilisateur. Cette méthode nécessite l'introduction de la classe use Auth;, puis utilise Hash::check() pour déterminer le mot de passe. Après le jugement, il reste encore une question, c'est-à-dire comment insérer le message d'erreur dans le message d'erreur du validateur. Ici, laravel nous fournit la méthode after :

$user = Auth::user();
$validator->after(function($validator) use ($oldpassword, $user) {
  if (!\Hash::check($oldpassword, $user->password)) { //原始密码和数据库里的密码进行比对
    $validator->errors()->add('oldpassword', '原密码错误'); //错误的话显示原始密码错误
  }
});
if ($validator->fails()) {   //判断是否有错误
  return back()->withErrors($validator); //重定向页面,并把错误信息存入一次性session里
}
$user->password = bcrypt($password);    //使用bcrypt函数进行新密码加密
$user->save();   //成功后,保存新密码

Ici parce que after . est introduit Une fonction anonyme PHP, nous devons donc utiliser le mot-clé use pour transmettre des données externes dans la fonction anonyme (PS : nouvelles fonctionnalités PHP, fermetures et fonctions anonymes)

dans la fonction anonyme Ici, nous avons introduit une fonction globale, nous devons donc ajouter (PS : nouvelles fonctionnalités php, chapitre sur l'espace de noms, espace de noms global) devant la fonction

5. Le devant end affiche un message d'erreur

Pour l'affichage front-end, nous utilisons la variable $errors pour afficher les erreurs. Selon la documentation officielle, l'exemple d'appel de IlluminateSupportMessageBag. est disponible. Si vous êtes intéressé, vous pouvez y jeter un oeil. Nous utilisons count($errors) > 0 pour déterminer s'il y a une erreur, et utilisons $errors->first() pour afficher un message d'erreur :


@if(count($errors) > 0)
  <p class="alert alert-danger display-hide" style="display: block;">
    <button class="close" data-close="alert"></button>
    <span>  </span>
  </p>
@endif

Quelqu'un peut demander si mon erreur est non affiché dans Si le message d'erreur est fixé à un endroit mais affiché derrière chaque formulaire, comment devons-nous le juger et l'afficher ? La réponse est d'utiliser $errors->has('oldpassword') pour déterminer s'il y a une erreur avec ce nom. Si tel est le cas, utilisez $errors->first('oldpassword') pour afficher cette erreur :


.
@if( $errors->has(&#39;oldpassword&#39;) )
  <p class="alert alert-danger display-hide" style="display: block;">
    <button class="close" data-close="alert"></button>
    <span>  </span>
  </p>
@endif

其中oldpassword是每个表单的里的name值,所以在使用after方法添加自定义错误的时候 $validator->errors()->add('oldpassword', '原密码错误');中,oldpassword一定要写对是在哪个表单的错误,这样才能正确的显示。

6、完成后的示例

UserController

public function getReset()
{
  return view(&#39;auth.reset&#39;);
}

public function postReset(Request $request)
{
  $oldpassword = $request->input('oldpassword');
  $password = $request->input('password');
  $data = $request->all();
  $rules = [
    'oldpassword'=>'required|between:6,20',
    'password'=>'required|between:6,20|confirmed',
  ];
  $messages = [
    'required' => '密码不能为空',
    'between' => '密码必须是6~20位之间',
    'confirmed' => '新密码和确认密码不匹配'
  ];
  $validator = Validator::make($data, $rules, $messages);
  $user = Auth::user();
  $validator->after(function($validator) use ($oldpassword, $user) {
    if (!\Hash::check($oldpassword, $user->password)) {
      $validator->errors()->add('oldpassword', '原密码错误');
    }
  });
  if ($validator->fails()) {
    return back()->withErrors($validator); //返回一次性错误
  }
  $user->password = bcrypt($password);
  $user->save();
  Auth::logout(); //更改完这次密码后,退出这个用户
  return redirect('/login');
}

reset.blade

<form class="login-form" action="" method="post">
    <h3 class="font-green">修改密码</h3>
    @if($errors->first())
      <p class="alert alert-danger display-hide" style="display: block;">
        <button class="close" data-close="alert"></button>
        <span>  </span>
      </p>
    @endif
    {!! csrf_field() !!}

    <p class="form-group">
      <label class="control-label visible-ie8 visible-ie9">原始密码</label>
      <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Old Password" name="oldpassword"> </p>
    <p class="form-group">
      <label class="control-label visible-ie8 visible-ie9">新密码</label>
      <input class="form-control placeholder-no-fix" type="password" autocomplete="off" id="register_password" placeholder="New password" name="password"> </p>
    <p class="form-group">
      <label class="control-label visible-ie8 visible-ie9">重复密码</label>
      <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Repeat password" name="password_confirmation"> </p>
    <p class="form-actions">
      <button type="submit" id="register-submit-btn" class="btn btn-success uppercase pull-right">确定</button>
    </p>
  </form>

相关推荐:

学习Laravel5的Eloquent 关系

laravel编写APP接口(API)

laravel5.5控制器传参顺序问题及解决方案

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn