Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第7回】

#制作環境

Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
MDBootstrap : 4.19.1
chart.js : 2.9.3
XAMPP
PHP : 7.4.3
Visual Studio Code

#関連記事

[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第1回】](https://qiita.com/Charry/items/74d5f9d2335a86a6ae17)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第2回】](https://qiita.com/Charry/items/9bb74c5b0384b3954a36)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第3回】](https://qiita.com/Charry/items/fcadc951691ae44144b0)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第4回】](https://qiita.com/Charry/items/79ad43e81a78733750fd)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第5回】](https://qiita.com/Charry/items/ed119428a385cc409f66)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第6回】](https://qiita.com/Charry/items/b2c3b1275d22d9aee3bc)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【最終回】](https://qiita.com/Charry/items/7e8ba0fe83920728105b)

#はじめに
この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。

記事を作成するにあたり、以下のサイトを参考にしています。
こちらの方が詳しいので、当方で付け加えている要件が不要であれば、以下を参考にした方がいいと思います。

https://reffect.co.jp/laravel/laravel-multi-authentication-understand

長くなるので、何回かに分けて記事を投稿します。

#LoginController.phpの更新
app/Http/Controllers/Admin/Auth 内のLoginController.phpを開きます。
![logincont.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/102ffc8a-8e8c-e957-2219-bec46412ff19.jpeg)

開いたら、内容を以下に修正します。

```PHP:LoginController.php
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::ADMIN_HOME;
```

さらに以下を追記し、メソッドを上書きします。

```PHP:LoginController.php
// この記述だけ画面のトップに
use Illuminate\Support\Facades\Auth;

    /**
     * ログインページの表示
     *
     * @return view
     */
    public function showLoginForm()
    {
        return view('admin.auth.login');
    }

    /**
     * guardメソッドの上書き
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return Auth::guard('admin');
    }
```

#ミドルウェアの修正
app/Http/Middleware 内のAuthenticate.phpを開きます。
![middleware.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/5861881e-3185-9346-379b-525ac10b1b3c.jpeg)

開いたら、内容を以下のように修正します。

```PHP:Authenticate.php
    /**
     * 認証されていないときにユーザーがリダイレクトされるパスを取得します。
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (!$request->expectsJson()) {
            if ($request->is('admin/*')) {
                return route('admin.login');
            }
            return route('login');
        }
    }
```

#コントローラの修正
app/Http/Controllers/Admin 内のAdminHomeController.phpを開きます。
![adminhomecont.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/7443b29d-84f8-8260-6f71-de4cc2695fb9.jpeg)

開いたら、内容を以下に修正。

```PHP:AdminHomeController.php
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }
```

次にapp/Http/Controllers/Admin/Auth 内のRegisterController.phpを開きます。
![register.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/ad23ee23-318f-8e75-732e-83d09f1f76d8.jpeg)

開いたら、内よを以下に修正。

```PHP:RegisterController.php
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin');
    }
```

#ミドルウェアの修正
app/Http/Middleware 内のRedirectifAuthenticated.phpを開きます。
![redirect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/6c5b70ce-1f20-1ad1-9395-401413044cfd.jpeg)

開いたら、内容を以下に修正します。

```PHP:RedirectifAuthenticated.php
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard()->check()) {
            return redirect(RouteServiceProvider::HOME);
        }

        if (Auth::guard('admin')->check()) {
            return redirect(RouteServiceProvider::ADMIN_HOME);
        }

        return $next($request);
    }
```

今回は以上で終了です。
基本的な設定はここで終了ですが、当方の場合管理者はログイン機能だけを使い、新規登録やパスワードを忘れた場合の変更はホームページ上からはできないようにします。
またログインはメールアドレスではなく、ユーザー名(ユーザーID)でできるようの変更します。
次回はそちらの方を掲載します。