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


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

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

[Laravel 6.0 ログイン機能を実装する - Qiita](https://qiita.com/ucan-lab/items/bd0d6f6449602072cb87)

[Laravel6.0「make:Auth」が無くなった 〜Laravel6.0でのLogin機能の実装方法〜MyMemo - Qiita](https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5)

[認証 6.x Laravel](https://readouble.com/laravel/6.x/ja/authentication.html)

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

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

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

## 1. モデルクラスを作成

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

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

```php:Admin.php

use Illuminate\Foundation\Auth\User as Authenticatable;

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

```

## 2. 認証ファイルに追記

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

```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に認証機能を追加

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

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

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

```php: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. ログイン後にログインページにアクセスした場合のリダイレクト先を指定

```php: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`とは別に作成する。

```php: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でマルチ認証(マルチログイン)を実装する](https://leben.mobi/blog/laravel5_multi_login/php/)

[【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】 | もんプロ～問題発見と解決のためのプログラミング〜](https://coinbaby8.com/laravel-multi-login.html)