[Laravel] Auth 機能とMiddlewareの設定(3)

今回は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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム