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

前回までは、社内サイトへアクセスするためのユーザー作成とログイン処理を作成しましたが、一般的な会員制のサイトと違い、誰でも登録するわけにはいきません。そこで、社員登録用の処理を下記のように一工夫する必要があります。

  1. ユーザー登録を行ったら、Admin宛てに承認用のメールを送信する。
  2. Adminが送られてきたメールの承認処理を行えば、本人宛に登録処理済みのメールを送信する。
  3. 登録ユーザーは、そこのリンクをクリックすれば、アクティベートされる。
  4. 未承認のデータが蓄積されるのを防ぐために、未承認データは削除します。

ユーザー登録申請

それでは、まず最初にpostCreateメソッドを下記のように修正します。

app/Http/Controllers/Auth/AuthController.php

  //ユーザーの新規作成
 public function postCreate(Request $request)
 {
 //バリデーション
 $val=$this->validator($request->all());
 if($val->fails()){
 return redirect()->back()->withErrors($val)->withInput();
 }
 $data=$request->only('name','email','password');
 $user=$this->create($data);
 $mail_path='auth/mail/apply';
 $this->applyMail($user->id,$mail_path);
 return "<h1>承認手続き中です。管理者からのメールをお待ちください。</h1>";
 }
  • 11行目:新規ユーザーを作成したら、ユーザー登録申請メールを送信するapplyMail()メソッドを実行します。メール送信後は、文字列を返すだけにしていますが、暇があれば、ビューファイルに作り直してもいいと思います。

管理人宛のユーザー登録申請メール送信ロジックを下記のように記述します。

app/Http/Controllers/Auth/AuthController.php

 protected $authMail='nakada@gmail.com';
 protected $authName='Administrator';
 protected $token;
 protected $table='password_resets';
 
 //tokenの発行
 protected function token($email)
 {
 $this->table=config('auth.password.table');
 $reset=\DB::table($this->table)->where('email',$email)->first();
 if($reset){
 return $reset->token;
 }else{
 $this->token=csrf_token();
 \DB::table($this->table)->insert([
 'email'=>$email,
 'token'=>$this->token,
 ]);
 return $this->token;
 }
 } //ユーザー登録申請メール送信
 protected function applyMail($user_id,$mail_path)
 {
 $user=User::find($user_id);
 $token=$this->token($user->email);
 $auth=['email'=>$this->authMail,'name'=>$this->authName,'_token'=>$token];
 \Mail::send($mail_path,['user'=>$user,'auth'=>$auth],function($m) use ($user,$auth){
 $m->from($user->email,$user->name);
 $m->to($auth['email'],$auth['name']);
 $m->subject('Winroadの承認手続き');
 });
 }
  • 7-20行目:トークンの発行にユーザー登録申請用のテーブルを作成してもいいのですが、せっかくデフォルトで、パスワード再設定用のテーブルがあるので、これを活用します。
  • 9行目:app/config/auth.phpに、パスワードリセット用の環境設定があります。パスワード設定用のテーブルを変更する場合は、ここを変更します。
  • 10行目:password_resetsテーブルの使用は、そんなに頻度が多くないので、モデルは作成せず、クエリービルダーでデータを抽出します。尚、DBクラスを使用するには、\DB::table()の用に先頭に、\を付けるか、先にuse DB;でDBクラスをインポートしておきます。

登録申請メールのテキストビューを下記のように作成します。

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

<h1>承認申請</h1>

<h3>{{ $auth['name'] }}さん、下記のユーザーよりユーザー登録の承認申請メールが届いています。</h3>
<hr>
<p>氏名 : {{ $user->name }}</p>
<p>メール : {{ $user->email }}</p>
<p>申請日時 : {{ date('Y年n月j日 H:i:s') }}</p>
<hr>

<p>下記のリンクをクリックして、承認か却下を決定してください。</p>

<a href="{{ url('auth/activate/'.$user->id.'/'.$auth["_token"]) }}"><h1>承認</h1></a>

<a href="{{ url('auth/deny-user/'.$user->id) }}"><h1>却下</h1></a>

<p>尚、却下の場合は、自動的に登録データを削除いたします。</p>

ユーザー承認処理

送信されてきたメールを元に、管理者が承認した場合の処理を下記のように記述します。

app/Http/Controllers/AuthController.php

  //アクティベート
 public function getActivate($id,$token)
 {
 $user=User::find($id);
 if(isset($user)):
 $passwordResets=\DB::table($this->table)->where('email',$user->email)
 ->where('token',$token)->delete();
 if($passwordResets):
 $this->activateMail($id);
 return "<h1>承認メールを送信しました</h1>";
 else:
 $user->delete();
 return "<h1>トークンエラーで、承認できませんでした。</h1>";
 endif;
 else:
 return "<h1>ユーザーが存在しません</h1>";
 endif;
 }
 //アクティベート拒否
 public function getDenyUser($id)
 {
 $user=User::find($id);
 if(isset($user)):
 \DB::table($this->table)->where('email',$user->email)->delete();
 $user->delete();
 return "<h1>ユーザーを削除しました。</h1>";
 else:
 return "<h1>ユーザーは存在しません</h1>";
 endif;
 }

承認メール送信のactivateMail()メソッドを下記のように記述します。

app/Http/Controllers/AuthController.php

  //ユーザー登録承認メール送信
 protected function activateMail($id)
 {
 $user=User::findOrFail($id);
 $user->activate=1;
 $user->save();
 $auth=['email'=>$this->authMail,'name'=>$this->authName];
 \Mail::send('auth.mail.activate',['user'=>$user,'auth'=>$auth],function($m) use ($user,$auth){
 $m->from($auth['email'],$auth['name']);
 $m->to($user->email,$user->name);
 $m->subject('Winroadの承認確認');
 });
 }

登録承認メールのテキストビューを下記のように作成します。

app/resources/views/mail/activate.blade.php

<h1>登録完了</h1>
<h3>{{ $user->name }}さん、登録が完了しました。</h3>
 <hr>
<p>下記のリンクをクリックして、ログインしてください。</p>
<a href="{{ url('auth/login') }}"><h1>ログイン</h1></a>

ユーザー非承認処理

ユーザー登録を拒否する場合の処理を下記のように記述します。

app/Http/Controllers/AuthController.php

  //アクティベート拒否
 public function getDenyUser($id)
 {
 $user=User::find($id);
 if(isset($user)):
 \DB::table($this->table)->where('email',$user->email)->delete();
 $user->delete();
 return "<h1>ユーザーを削除しました。</h1>";
 else:
 return "<h1>ユーザーは存在しません</h1>";
 endif;
 }

これで、ユーザーの作成者は、社員にやって貰い、管理者は、承認申請メールをクリックするだけで済みます。

最後に、ログインの認証手続きに、activateを追加します。

 //認証手続き
 Auth::attempt([
 'name'=>$request->name,
 'password'=>$request->password,
 'activate'=>1,
 ],$request->remember_me);
 return redirect()->to('home/index');
  • 尚、usersテーブルにactivate用のフィールドを追加しておいてください。

本日は、以上です。

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

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

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

コメントをどうぞ

このページの先頭へ