Laravel5で社内専用サイト(5)

前回は、登録ユーザーの承認(アクティベート)処理を行いましたが、今日は、登録ユーザーがパスワードを忘れた場合の、パスワード再発行処理を作成してみたいと思います。

パスワードの再発行処理は、前回作成した登録ユーザーの承認処理とほとんど同じですので、そんなに難しくないと思います。

  1. ログイン画面のリンクからパスワード再発行用のページへ移動
  2. メールアドレスを入力すれば、登録ユーザー宛に再発行ページのリンクが記載されたメールが届く
  3. 新規パスワードを入力すれば、ログインできる
  4. 例外として、アクティベートされていないユーザーからの再発行申請は、却下します。

パスワードの再発行申請

まず、再発行申請用には、デフォルトで、PasswordController.phpが用意されているので、それをそのまま使用してもいいのですが、前回の承認処理と同じような記述で簡単に作成できますので、自分で作成したいと思います。

それでは、パスワード喪失時のメソッドを下記のように作成します。

app/Http/Controllers/Auth/AuthController.php

//パスワード喪失
 public function getRemind()
 {
 return view('auth.remind');
 }
 //パスワード再発行申請メール
 public function postRemind(Request $request)
 {
 $val=$this->validate($request,[
 'email'=>'required|email|exists:users'
 ]);
 $user=User::where('email',$request->email)->first();
 if(is_null($user->activate)):
 \DB::table($this->table)->where('email',$user->email)->delete();
 return "<h1>アクティベートされていません。<br>管理人にお問い合わせください。";
 endif;
 //トークンの発行
 $token=$this->token($user->email);
 $auth=['email'=>$this->authMail,'name'=>$this->authName,'_token'=>$token];
 \Mail::send('auth.mail.remind',['user'=>$user,'auth'=>$auth],function($m) use ($user,$auth){
 $m->from($user->email,$user->name);
 $m->to($user->email,$user->name);
 $m->subject('パスワードの再発行');
 });
 return "<h1>パスワード再発行メールを送信しました</h1>";
 }
  • 9-11行目:Laravel5のベースコントローラーは、ValidatesRequestsトレイトを取り込んでいますので、簡単にバリデートすることができます。validate()メソッドは、第1引数に、バリデートしたいデータ、第2引数にバリデート条件を記述することで、簡単に、バリデートすることができます。上記は、下記と同様です。
    $val=\Validator::make($request->all(),[
    'email'=>'required|email|exists:users'
    ]);
    if($val->fails()){
    return redirect()->back()->withErrors($val)->withInput();
    }
  • 25行目:前回作成したtoken()メソッドを使用して、トークンを発行し、データベースに保存しています。

パスワード再発行申請メールのビューを下記のように作成します。

app/resources/views/auth/mail/remind.blade.php

<h1>パスワード再発行</h1>
<h3>{{ $user->name }}さん、パスワード再発行の承認申請メールを受け付けました。</h3>
 <hr>
 <p>パスワードを再設定する場合は、「再発行」を、メールに覚えがない、
 もしくは、パスワードの再発行が不要の場合は、「再発行不要」をクリックしてください。</p>
<a href="{{ url('auth/reissue/'.$user->id.'/'.$auth["_token"]) }}"><h1>再発行</h1></a>
<a href="{{ url('auth/needless/'.$user->id) }}"><h1>再発行不要</h1></a>
  • 6行目:urlヘルパーは、指定されたパスへの完全なURLを生成します。第2引数に、配列でパラメータを渡すことができます。上記は、下記のように記述することができます。
    url('auth/reissue',[$user->id,$auth['_token']]);

パスワードを再設定するためのreissueメソッドと、パスワード再発行中止のためのgetNeedlessメソッドを下記のように作成します。

//パスワードの再発行
 public function getReissue($id,$token)
 {
 $user=User::find($id);
 if(is_null($user->activate)):
 return "<h1>アクティベートされていません。<br>管理人にお問い合わせください</h1>";
 else:
 $reset=\DB::table($this->table)
 ->where('email',$user->email)
 ->first();
 if($reset && $token == $reset->token):
 return view('auth.reissue')->withToken($token)->withUser($user);
 else:
 return "<h1>トークンエラーです。<br>再度申請してください。</h1>";
 endif;
 return "<h1>パスワードの再発行ができません。<br>管理人にお問い合わせください。</h1>";
 endif;
 }
 public function postReissue(Request $request)
 {
 $val=\Validator::make($request->all(),[
 'name' => 'required',
 'password' => 'required|confirmed|min:8',
 ]);
 if($val->fails()){
 return redirect()->back()->withErrors($val)->withInput();
 }
 $user=User::find($request->id);
 $reset=\DB::table($this->table)
 ->where('email',$user->email)
 ->where('token',$request->token)
 ->first();
 if($reset):
 $user->password = bcrypt($request->password);
 $user->save();
 endif;
 return redirect()->to('home/index');
 }
//パスワード再発行処理の中止
 public function getNeedless($id)
 {
 $user=User::find($id);
 if($user):
 \DB::table($this->table)->where('email',$user->email)->delete();
 endif;
 return "<h1>再発行処理を中止しました</h1>";
 }
  • 21-27行目:ValidateRequestsトレイトを使えば、下記のように簡単に記述することができます。
    $this->validate($request,[
    'name' => 'required',
     'password' => 'required|confirmed|min:8',
     ]);

パスワード再設定用のビューを下記のように作成します。

app/resources/views/auth/reissue.blade.php

@extends('tbs.base')
 @section('title','パスワードの再発行')
 @section('content')
 <div class="jumbotron">
 <h2 class="text-center">@yield('title')</h2>
 <form class="form-horizontal" method="POST">
 {!! csrf_field() !!}
 <div class="form-group">
 <label class="col-sm-2 control-label">お名前</label>
 <div class="col-sm-10">
 <input type="name" name="name" value="{{ old('name') }}" class="form-control" placeholder="name">
 @if($errors->first('name'))
 <p class='alert alert-danger'>{{ $errors->first('name') }}</p>
 @endif
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-2 control-label">パスワード</label>
 <div class="col-sm-10">
 <input type="password" name="password" class="form-control" placeholder="Password">
 @if($errors->first('password'))
 <p class='alert alert-danger'>{{ $errors->first('password') }}</p>
 @endif
 </div>
 </div>
 <div class="form-group">
 <label for="confirm" class="col-sm-2 control-label">パスワードの確認</label>
 <div class="col-sm-10">
 <input type="password" name="password_confirmation" class="form-control" id="password" placeholder="Password">
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-offset-2 col-sm-10">
 <input type="hidden" name="token" value="{{ $token }}">
 <input type="hidden" name="id" value="{{ $user->id }}">
 <button type="submit" class="btn btn-default">パスワードの変更</button>
 </div>
 </div>
 </form>
 </div>
 </div>
 @stop

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ