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

#制作環境

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 マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第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 マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【第7回】](https://qiita.com/Charry/items/e1d8e2383adbfa7eb704)
[Laravel 6.x / 7.x マルチ認証の設定方法 ユーザーと管理者を分けてログイン 【最終回】](https://qiita.com/Charry/items/7e8ba0fe83920728105b)

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

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

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

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

#記事作成理由
理由はメモとして残したいのが一番ですが、この機能を実装させるまで結構あちこちのサイトを見ることになった為、見つけやすくなるかなと思い作成しました。

#やりたい事
####かんたんなECサイトの作成
個人的な追加要件の一部として以下を追加。

・管理者とユーザーのテーブル(データベース)を分ける
・管理者とユーザーは別々にログインする。
・管理者は管理者ページ、ユーザーはユーザーページしか参照できない

CodeCampというオンラインでの学習の後、独学でLaravelを学んでいます。
そこで、CodeCampで最後に課題として提出したECサイトを、Laravelで個人的な要件を含みながら作成してみる事にしました。

課題では、管理テーブルは一つで、ユーザー名adimin、パスワードadminの場合は管理者ページが開くような要件でした。
ですが、管理者とユーザーが一緒のテーブル上っていうのがいやだったので、方法を探す事にしました。

#はじめる前に
この方法は「はじめに」で記載しているサイトでやっている方法に、以下の2点を加えて作成していきます。

・モデルはModelsフォルダで管理する
・ログインの認証をメールアドレスからユーザー名(ユーザーID)に変更する。

上記が必要なければリンク先をご確認下さい。

リンク先はLaravel 7.xでの案内ですが、当方の6.x環境でも問題無く動作しました。
また、認可(ポリシー)を利用した方法ではないので、認可についての記事を探されている方は、別の記事を探して下さい。
事前にLaravelをインストールしておいてください。


#laravel/uiのインストール
Laravelに認証機能をインストールしていきます。
6.x と 7.xで若干違うので、自分にあった方でlaravel/uiをインストールしてください。

プロジェクトフォルダのディレクトリでターミナルを開き、以下を実行してください。

####Laravel 6.x 

```PHP:Laravel6.x
composer require laravel/ui:^1.0 --dev
```

####Laravel 7.x 

```PHP:Laravel7.x
composer require laravel/ui
```

これでphp artisan uiコマンドが使えるようになります。

#Authのインストール
次に以下のコマンドを上から順に実行してください。

####Laravel 6.x / 7.x 共通

```PHP:Laravel6.x
php artisan ui vue --auth
npm install & npm run dev
```

ここではVue(+Bootstrap)と認証機能(Auth)を同時にインストールしてます。
--auth を付けないと認証機能は付与されないので注意!

他にも
php artisan ui bootstrap --auth 等ありますが、違いを詳しくしりたい方は以下リファレンスを参照してください。

Laravel 6.x
https://readouble.com/laravel/6.x/ja/frontend.html
https://readouble.com/laravel/6.x/ja/authentication.html

Laravel 7.x
https://readouble.com/laravel/7.x/ja/frontend.html
https://readouble.com/laravel/7.x/ja/authentication.html

#Modelsフォルダの作成
デフォルトだとモデルはappの直下に作成されます。
管理がしやすいようにModelsフォルダを作成すると共に、UserモデルをModelsフォルダに移動しておきます。

作成方法は色々あると思いますが、ここでは手動でフォルダを作成します。
コマンド使いたい方は以下を参考にしてください。
https://yama-itech.net/move-laravel-model-to-directory

エディター上、もうしくは直接プロジェクトのフォルダを開き、ディレクトリがapp>Modelsになるよう、Modelsフォルダを作成します。

![ディレクトリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/c3a8d89c-d8ed-c44a-32eb-53ab12e08dfd.jpeg)

####★ポイント★
新規でモデルを作成する際は、

```PHP
php artisan Make:model Models/Sample
```

上記のようにModels/をモデル名の前につけ、Modelsフォルダの中に作成します。
また、モデルの名前は必ず単数形にしましょう。


####Userモデルの移動
User.php がappの直下にあるので、作成したModelsフォルダに移動します。

コマンドでもドラッグ・アンド・ドロップどちらでもかまいません。

#Userモデル移動後の修正
移動後以下の項目の内容を修正します。

・User.php
・app/Http/Controllers/Auth/RegisterController.php
・config/auth.php

####User.phpの修正
Modelsフォルダに移動したUser.phpを開き、以下のように修正します。

#####修正前

```PHP:User.php
namespace App;
```

#####修正後

```PHP:User.php
namespace App\Models;
```

####RegisterController.phpの修正
app/Http/Controllers/Auth 内の RegisterController.phpを開き、以下のように修正します。

#####修正前

```PHP:RegisterController.php
use App\User;
```

#####修正後

```PHP:RegisterController.php
use App\Models\User;
```

####configの修正
config 内の auth.phpを開き、以下のように修正します。

#####修正前

```PHP:auth.php
'model' => App\User::class,
```

#####修正後

```PHP:auth.php
'model' => App\Models\User::class,
```

今回はここで終了です。
次回に続きます。