Laravel 5.6 ログイン認証回数制限で、ユーザー名以外をキーにする方法

Laravelのログイン認証の回数制限は、デフォルトでは、『制限はユーザの名前/メールアドレスとIPアドレスで限定されます。』と書かれている。

認証 5.3 Laravel

独自認証でユーザー名以外をキーにした場合の認証回数制限の方法をメモしておく。

 

1.ログインに使用するコントローラーに、以下の赤字を追記する。

(認証回数制限なしのコントローラーの作成方法は以下の記事)

fushigi.hatenadiary.com

 

<?php


//namespace App\Http\Controllers\Auth; //コメントアウト
namespace App\Http\Controllers\ViewAuth; // 追加

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

use Illuminate\Http\Request;// 追加
use Illuminate\Support\Facades\Auth;// 追加
use Illuminate\Support\Str;//認証回数制限用に追加
 
use App\Viewer;//追加
use Validator;//追加

class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/

use AuthenticatesUsers;

/**
* Where to redirect users after login.
*
* @var string
*/
//protected $redirectTo = '/viewer';//変更

/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//$this->middleware('guest')->except('logout');
$this->middleware('guest:viewuser')->except('logout');//変更
}
 
//以下追加
protected function guard()
{
return Auth::guard('viewuser'); //config/auth.phpで追加したguardを指定
}

//初期アクセス時。または認証後のアクセス時
public function index($page_id)
//$page_idは、web.phpの中で、Route::get('viewer/{page_id}'
//として指定している変数
{
$ninsyou = 0;//認証フラグ
//そのページにパスワードがついているかどうかを調べる
$password = Viewer::where('page_id', $page_id)->first();

if ($password->password != NULL) {//パスワードありの場合
if (Auth::guard('viewuser')->check()) { //認証済みの場合の処理。
$user = Auth::guard('viewuser')->user();
//guard('viewuser')のため、viewerテーブルのレコードが返される。
if ($user->page_id == $page_id) {
$ninsyou = 1; //認証OK
} else {
//違うページで認証は通っていたが、このページでは認証が通っていない場合
$ninsyou = 0;
}
} else { //未認証の場合の処理
$ninsyou = 0;
}
} else {//パスワードがない場合、そのままビュー画面へいく
$ninsyou = 1; //認証OK
}

if ($ninsyou==1) {
$this->view($page_id);
} else {
//ログインページへリダイレクト
return redirect()->route('viewlogin', ['page_id' => $page_id]);
}
}

//認証ページの表示
//$requestは、認証失敗時にGETでついてくるpass_eroorを取るために必要。
//$page_idは、web.phpで指定している、Route::get('viewer/login/{page_id}'の部分。
public function showLoginForm(Request $request, $page_id)
{
//function authenticate()で認証に失敗すると、
//redirect()でpass_error=1が付いてくる。
$pass_error = $request->input('pass_error');
 
return view('viewer.viewerlogin',
['page_id'=>$page_id, 'pass_error'=>$pass_error]);
}

//自前の認証
public function authenticate(Request $request)
{
//validatorを指定しないとエラーになる
$validator = Validator::make($request->all(), [
'page_id' => 'required|unique:posts',
'password' => 'required',
]);

 
//認証回数制限ここから
if ($this->hasTooManyLoginAttempts($request)) {
logger('認証回数制限!');
return $this->sendLockoutResponse($request);
}
//認証回数制限ここまで
 
Auth::guard('viewuser');

$page_id = $request->input('page_id');
$password = $request->input('password');

if (Auth::guard('viewuser')
->attempt(['page_id' => $page_id, 'password' => $password])) {
logger('認証成功!');
//閲覧ページを表示
return redirect()->route('viewurl',['page_id' => $page_id]);
} else {
logger('認証失敗');
$this->incrementLoginAttempts($request);//認証回数制限用に追加
//ログインページに戻る
return redirect()->route('viewlogin', ['page_id' => $page_id, 'pass_error'=>1]);
}
}

//認証回数制限ここから
protected function throttleKey(Request $request)
{
//デフォルトではユーザー名で認証回数制限をチェックしていた。
//これをpage_idに変える
//return Str::lower($request->input($this->username())).'|'.$request->ip();
return Str::lower($request->input('page_id')).'|'.$request->ip();
}
//認証回数制限ここまで
public function view($page_id)
{
認証後の閲覧ページの処理;
}

}