Laravel8で認証機能を理解する

https://readouble.com/laravel/8.x/ja/authentication.html
認証機能の説明をします。通常は上から見るか下からみるかという得意分野がありますが、今回は両方から見てみようと思います。Laravelの場合はページが有る場合にはRouthingがあるので基本的には上からみていった方がわかりやすいです。しかし今回の認証に至ってはusersテーブルから認証の条件をひろっているので下から見てもかなり明確です。

Laravelのログイン認証の仕組みを使って、独自のクラスでの拡張を行う場合は、config/auth.phpのprovidersでmodelを独自のものに変更したり、LoginControllerで利用している、AuthenticatesUsersトレイトのattemptLoginやcredentialsあたりをオーバーライドすると、ユーザー名とパスワード以外の独自のデータ照合ができると思います。認証のガードを複数定義すれば、あるガードで認証しているかどうかも判別できます。

ログイン周りのRouting

表面的には/login/forgot-password/registerなどのURLが設定されています。デフォルトで利用しているbladeはresources/views/auth/*にまとめて生成されていると思います。ログイン時には、resources/views/auth/login.blade.phpが使われることになります。
/loginにアクセスすると内部のコントローラでログインしていればダッシュボード、ログインしていなければログイン画面というリダイレクトの出し分けを行っています。
ルーティングでは以下のコードが追加されていると思います。

# routes/web.php

Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');
# routes/api.php
...
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
...

認証関連の処理はミドルウェアでやっているようです。ミドルウェアについて詳しいことがわからない人はここがとてもよいので読んで見てください。ここもよいです。
ログイン部分のミドルウェアはapp/Http/Middleware/Authenticate.phpこれになります。中身を見てみると、認証していない場合($request->expectsJson()が返ってこない!)は、/loginにリダイレクトする設定が書いてあります。

...
protected function redirectTo($request)
{
    if (! $request->expectsJson()) {
        return route('login');
    }
}
...

$request->expectsJson()が認証処理の入り口といったところです。これはuse Illuminate\Auth\Middleware\Authenticateで行っているようです。Laravelのフレームワークで実行しているんですね。

認証のミドルウェア

use Illuminate\Auth\Middleware\Authenticateの実態はvendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.phpになります。通常フレームワーク内のソースには修正を加えないというのが開発のゆるい約束です。compsoerでupdateしたときに上書きされてしまうので、基本的にはこれらのソースを改変したい場合は別のコントローラを作成してオーバーライドします。

テーブル

app/app/Models/User.phpが会員情報を保持しているテーブルです。このモデルがどのコントローラで使われているのかというと、


  • News

  • Categories

  • Tags

  • Archives

  • Page index