LoginSignup
23
30

More than 3 years have passed since last update.

【Laravel】マルチログイン(ユーザーと管理者)機能

Last updated at Posted at 2020-02-13

Laravel6で認証をユーザーと管理者など複数にわける場合のメモ。

まずは普通にログイン機能を実装

Laravel 6.0 ログイン機能を実装する - Qiita

Laravel6.0「make:Auth」が無くなった 〜Laravel6.0でのLogin機能の実装方法〜MyMemo - Qiita

認証 6.x Laravel

ここは参考になる記事が多くあるので説明は省略。

作成したログイン機能に追加

新しく管理者(Admin)の認証機能を追加する。

1. モデルクラスを作成

他のモデルクラスと同じようにマイグレーションファイル(DB)とモデルクラス(Admin.php)を作成。

モデルクラスはIlluminate\Database\Eloquent\ModelではなくIlluminate\Foundation\Auth\Userを継承する。

Admin.php

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable // ModelではなくAuthenticatable 
{
}

2. 認証ファイルに追記

下記の内容をconfig/auth.phpに追記する。

auth.php
'guards' => [
...
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
...
],

'providers' => [
...
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class, // 1 で作成したモデルを指定
        ],
...
],

'passwords' => [
...
        'admin' => [
            'provider' => 'admin',
            'table' => 'password_resets',
            'expire' => 60,
        ],
...
],

3. Routeに認証機能を追加

web.php
Route::group(['middleware' => 'auth:admin'], function () {
...
});

4. ログインしていない場合のリダイレクト先を指定

ログイン処理が必要なURLにログインせずにアクセスした場合のリダイレクト先を
ユーザー、管理者等で分けたい場合は記述する。

app/Exceptions/Handler.php

   protected function unauthenticated($request, AuthenticationException $exception)
    {
        if($request->expectsJson()){
            return response()->json(['message' => $exception->getMessage()], 401);
        }

        if (in_array('admin', $exception->guards(), true)) {
            return redirect()->guest(route('admin.login'));
        }

        return redirect()->guest(route('login'));
    }

5. ログイン後にログインページにアクセスした場合のリダイレクト先を指定

app/Http/Middleware/RedirectIfAuthenticated
    public function handle($request, Closure $next, $guard = null)
    {
        switch ($guard) {
            case 'admin':
                $redirectPath = '/admin/index';
                break;
            default:
                $redirectPath = '/index';
                break;
        }
        if (Auth::guard($guard)->check()) {
            return redirect($redirectPath);
        }

        return $next($request);
    }

6. ログインコントローラー作成

ユーザーの認証に使用しているLoginControllerとは別に作成する。

LoginController
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = 'admin/index';  // ログイン後のリダイレクト先

    public function __construct(Request $request)
    {
        $this->middleware('guest:admin')->except('logout');;
    }

    protected function guard()
    {
        return Auth::guard('admin');
    }

}

その他username, showLoginFormなどのメソッドはユーザーのLoginControllerと同じように、必要に応じて設定する。

参考

Laravelでマルチ認証(マルチログイン)を実装する

【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】 | もんプロ~問題発見と解決のためのプログラミング〜

23
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
30