[Laravel] Auth 機能とMiddlewareの設定(3)
- 2022年7月14日
- 技術情報
今回はLaravel標準の認証機能とMiddlewareによる認証チェック機能についての情報を
シェアしたいと思います。
本記事は前回の「[Laravel] Auth 機能とMiddlewareの設定(2)」の続きです。
前回の記事ではLaravel Authのログイン機能で、任意のテーブルの任意カラムをID/PWの
参照先として設定する方法を紹介しました。
しかしpasswordのカラム名が標準の「password」ではなく、「pw」になっていたため、
認証機能がうまく動作しませんでした。
こちらが動作するように修正するにはModelの調整が必要になります。
今回はその方法をシェアします。
任意のカラムをLaravel AuthのPassword参照先として設定する。
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class Member extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
public function getAuthPassword()
{
return $this->pw;
}
}
Memberモデルを以上のように設定変更することで実行結果が true になり正しく動作するようになりました。
ログイン後sessionからuserテーブル情報を取得することも可能です。
dd(auth()->guard('web2')->user()->uid);
実行結果:test3
共通処理のMiddleware化
ログインチェック、権限チェックなどの共通処理はMiddleware化して
routeに設定することで共通処理化することが可能です。
試しに以下のMiddlewareを作成しました。
\app\Http\Middleware\LoginCheck.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class LoginCheck
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
Log::info('test', ['memo' => 'LoginCheck']);
return $next($request);
}
}
動作確認用に、このMiddlewareが呼び出されるとLogを出力するように設定しています。
Middlewareを使用するためには
\app\Http\Kernel.php
への登録が必要です。
protected $routeMiddleware = [
'login_check' => \App\Http\Middleware\LoginCheck::class,
];
Middleware検証用に
\routes\web.php
に2つのテスト用routeを追加しました。
Route::get('/testa', [TestController::class, 'testa']);
Route::get('/testb', [TestController::class, 'testb']);
testbのみに先ほど作成したMiddlewareを設定します。
Route::get('/testa', [TestController::class, 'testa']);
Route::group(['middleware' => ['login_check']], function() {
Route::get('/testb', [TestController::class, 'testb']);
});
以下のURLにアクセスして動作の確認をおこないます。
http://localhost/testa
実行結果:Logが生成されない
http://localhost/testb
実行結果:Logが生成される
Logの生成で確認をおこないましたがこの部分にログインチェック、権限チェックなどの
共通処理を設定することによりrouteをgroup化して複数のrouteに共通処理を適用することが
可能になります。
木曜日担当:nishida
nishida at 2022年07月14日 10:00:00