Laravelで、マルチ認証を知っていますか。マルチ認証ということばは知っていなくても、機能は見たことがあると思います。
代表的なのは、管理者とユーザーに分けたり、企業と求職者に分けたり。
ユーザー別に権限を変え、機能やViewで表示する内容を変えるときに用います。
多くのエンジニアの方々が、マルチ認証について解説してくれています。
ただ、初心者エンジニアからすると、分かるような、分からないような。 要するに、何処かが制御しているのか。まずは知りたい。
と、言った課題を感じます。
(最終的には、フレームワークが何の処理をしているのかを総合的に理解する必要はあると思いますが。)
今回は、簡潔に、マルチ認証を制御しているところは何処なのかを解説します。
色々と調べつつ、実験しながら間違った情報ではないのですが、
確証を持てていないので、違ったら申し訳ないです…
ただ、初心者エンジニアの方で、簡潔に知りたい場合は一読の価値はあるのかなと思います。
では、いってみましょう。
1:マルチ認証を制御するために必要なパーツ
2:マルチ認証を制御しているのに変更する部分
1:マルチ認証を制御するために必要なパーツ
・ログイン時に所有する権限
・ 権限に応じて、閲覧可能(閲覧不可)に制御する方法(機能の場合もあるが…)
簡単にいってしまうと、この2つです。
認証とは、ログインした際に付与されるものです。
(おそらく、sessionが所持しているのだと思ってます。違ったらごめんなさい…)
で、このログインのタイミングで、権限を付与して、その権限に応じて、Viewの制御をしてあげればよいのです。
2:マルチ認証を制御しているのに変更する部分
では、それぞれどこで制御しているのかを確認していきましょう。
ログイン時に所有する権限
権限の付与が全てと言っても過言ではありません。
この権限の付与のために操作するべきところは
・LoginさせるためのController(LoginController.phpなど)
・config/auth.php
この2つです。
(この2つを操作する前に整えなけらばいけないことは省きます。簡潔に。)
guardという機能を使って設定していきます。
LoginさせるためのController (LoginController.phpなど) に対して、
下記を追記します。
protected function guard() { return Auth::guard('admin'); // adminという権限を付与しています。 // 名称は必要に応じて変更してOK }
また、Authファザードを使うので、下記を忘れずに。
use Illuminate\Support\Facades\Auth;
config/auth.php を操作していきます。
細かい説明は省いてしまいますが、
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'user' => [ 'driver' => 'session', 'provider' => 'users', // 'provider' => 'admins', ], // Admin用の認証を追加 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ] 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], // Admin用のmodel連携を追加 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ] ],
adminという権限を付与するためにadmin部分を追加します。
これがあることによって
・Auth::guard(‘admin’); が使えるようになります。
・また、adminsというDBからユーザー認証するためのログインユーザーを抽出できます。
先ほども言及した通り、認証はログイン時に付与される権限です。
どこのDBからのログインなのかで、認証を切り分ける仕組みがあるのです。
・ 権限に応じて、閲覧可能(閲覧不可)に制御する方法
権限を付与できたら、後はどの権限なのかによって閲覧可能 / 不可を制御してあげればOKです。
やり方は幾つかあると思います。
Routeで制御する方法と、Controllerで制御する方法です。
どちらにしても、Middlewearを使って制御します。
controllerで制御する方法を紹介しておきます。
ルーティングで振り分けるcontrollerのconstructにて宣言します。
この宣言によって、admin 権限を持って、ログインしたユーザーのみ閲覧することができます。
public function __construct() { $this->middleware('auth:admin'); }