Bladeのディレクティブ@auth
とは
Laravelで認証機能を実装すると、未認証と認証済みの2つの状態ができます。
この際に認証済みのユーザーにのみ特定の内容を表示したい場合に使えるBladeディレクティブです。
書き方はこの通り
@auth
// ここに認証済みのユーザに表示させる内容を実装
@else
// ここに未認証のユーザに表示させる内容を実装
@endauth
例えば認証済みであれば、画面右上にマイページリンクとログアウトリンクを表示する
というようなことができます。
コードで表すとこの通り
※シンプルにするためにココでは<form>
やCSSなどのコードは省いています
@auth
<a href="#">マイページ</a>
<a href="#">ログアウト</a>
@else
<a href="#">ログイン</a>
@endauth
【ここからが本題】@auth
のカスタマイズについて
まずは経緯から
当初は1つのみ認証機能と先ほど紹介したマイページリンク、ログアウトリンクなどの表示制御も実装していました。
ただ1つのみでなく管理者ユーザー、一般ユーザーのように権限が異なるユーザーのログイン画面、認証ロジックを完全に別に変更しようと考えました。
※これをマルチ認証という
無事管理者ユーザーの実装が完了してテストをしていると...
認証済みであるにも関わらずマイページリンクとログアウトリンクが表示されないではありませんか!!
なぜだなぜだと調査した結果、@auth
ディレクティブの仕様に関係していました。
@auth
ディレクティブの仕様について
実際のところやっているのはこれと同じようです
if (Auth::check()) {
// ここに認証済みのユーザに表示させる内容を実装
} else {
// ここに未認証のユーザに表示させる内容を実装
}
そんでこのif
の中でやっているAuth::check()
ではweb
guard に対してのみ判定を行ってくれるそうで、
今回私はweb
guard をなくして user
guard と admin
guard にカスタマイズしていました。
その影響でweb guardに対してのみ判定が行われている @auth
が効かなかったということなんですね〜
中身まで理解していなかったので「ほえ〜〜〜〜」と感心してしまいました。
@auth
のカスタマイズ
この書き方で特定のguardに対して認証チェックを行うことができます。
Auth::guard('user')->check() // `user` guard に対して判定
これを使ってLaravel起動時に認証してあげれば良いということで
App\Providers\AppServiceProvider.php
のboot()
に以下のように書きます。
超簡単に説明すると、「Bladeでauth
が使用されたらデフォルトのAuth::check()
ではなくAuth::guard('user')->check()
を使う」と設定しています。
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Auth;
public function boot()
{
Blade::if('auth', function () {
return Auth::guard('user')->check(); // ここで @auth の認証を'user' ガードを見るようにに強制
});
}
これで@auth
ディレクティブをつかうと、user
guard を見て認証のチェックが実行されるようになります!
ちなみにAppServiceProvider.php
はざっくりアプリ全体の設定やカスタマイズをまとめて書く場所と考えておけばいいかなと思っています。
アプリケーションの起動時に何をするかを書くことが多いですね。
てことで今回は@auth
ディレクティブのカスタマイズについて書かせていただきました。
やっぱコーディングは楽しいですね🙃