🦔
Laravel マルチ認証で認証後は、通常、ガード名の指定は不要
はじめに
小ネタですが、マルチ認証で認証した後は、通常はガード名の指定は不要です。
例えば、管理者用に admins テーブルと admin ガードがあり、無事管理画面にログイン後は、その後の処理では、ガード名の指定は普通は不要です。
具体的には、
public function index(Request $request)
{
// ガード名を指定した場合
$name = auth('admin')->user()->username;
// ガード名不要でOK
$name = auth()->user()->username;
$name = \Auth::user()->username;
$name = $request->user()->username; // 本来user()の引数でガード名指定可
// ガード名不要でOK
auth()->logout();
といった感じです。
この理由は、Authenticate ミドルウエア(Illuminate\Auth\Middleware\Authenticate)と Illuminate\Auth\AuthManager に見る事ができます。(下記は、Laravel8の場合)
// Authenticate ミドルウエア
protected function authenticate($request, array $guards)
{
if (empty($guards)) {
$guards = [null];
}
foreach ($guards as $guard) {
if ($this->auth->guard($guard)->check()) {
return $this->auth->shouldUse($guard); // ★ここ
}
}
$this->unauthenticated($request, $guards);
}
// AuthManager
public function shouldUse($name)
{
$name = $name ?: $this->getDefaultDriver();
$this->setDefaultDriver($name);
$this->userResolver = function ($name = null) {
return $this->guard($name)->user();
};
}
public function setDefaultDriver($name)
{
$this->app['config']['auth.defaults.guard'] = $name;
}
つまり、認証チェックする度に、そのチェックに使ったガードをデフォルトのガードとするからです。adminで認証しているなら、admin がデフォルトのガードにセットされます。
もちろん、マルチ認証を使っている以上は、ガード名を意識しないといけない箇所はありますが(RedirectIfAuthenticated ミドルウエアなど)、必要以上にガード名を指定しなくても大丈夫、という感じです。
雑感
ソースをチラ見していると、結構こういう Laravel の優しさを感じる所があったりします。
間違い等ありましたらコメント下さい。
Discussion