https://readouble.com/laravel/8.x/ja/authentication.html
認証機能の説明をします。通常は上から見るか下からみるかという得意分野がありますが、今回は両方から見てみようと思います。Laravelの場合はページが有る場合にはRouthingがあるので基本的には上からみていった方がわかりやすいです。しかし今回の認証に至ってはusersテーブルから認証の条件をひろっているので下から見てもかなり明確です。
Laravelのログイン認証の仕組みを使って、独自のクラスでの拡張を行う場合は、config/auth.phpのprovidersでmodelを独自のものに変更したり、LoginControllerで利用している、AuthenticatesUsersトレイトのattemptLoginやcredentialsあたりをオーバーライドすると、ユーザー名とパスワード以外の独自のデータ照合ができると思います。認証のガードを複数定義すれば、あるガードで認証しているかどうかも判別できます。
表面的には/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
が会員情報を保持しているテーブルです。このモデルがどのコントローラで使われているのかというと、