Laravelの認証機能をカスタマイズする

Laravelの認証機能をカスタマイズする

Laravelには、「[laravelの認証機能を試す](https://qiita.com/t-iguchi/items/93d9c75e5cc526829fa0)」のように、認証機能が備わっていますが、業務で使うために少しカスタマイズする必要があります。
ここでは、この機能について以下の２点への対応をしたいと思います。

・メールアドレスでの認証を、ユーザIDに変更する。
・ゲストユーザ、一般ユーザと管理者でサイトを制限するために、ロールを追加する。

###1.ユーザマスタを変更する

まずは、認証用のテーブル（users）にカラムを追加します

####(1)マイグレーションファイルを作成する。

コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。

```
php artisan make:migration update_users_table --table=users
```

####(2)マイグレーションファイルを編集する。

database\migrationsに、「XXXX_XX_XX_XXXXXX_update_users_table.php」というファイルが作成されています。
これを編集し、up, downに「userid」「role」を追加します。

```database\migrations\2018_10_27_074348_update_users_table.php
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('userid')->unique()->after('email');
            $table->tinyInteger('role')->default(0)->after('password')->index('index_role')->comment('ロール');
        });
    }
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('userid');
            $table->dropColumn('role');
        });
    }
```

####(3)マイグレーションを実行する。

コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。

```cmd.prompt
php artisan migrate
```

以上でusersテーブルの変更が完了です。

###2.Controllerを修正する

####(1)Controllerを修正する

LoginControllerの最後に、username function を追加して、useridを返すようにします。

```app\Http\Controllers\Auth\LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
・・・
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
    * add
    */
    public function username()
    {
        return 'userid';
    }
}

```

###3.Registerを修正

####(1)formファザードをプロジェクトに追加する

ユーザマスタを登録する画面にuseridとroleを追加していきます。roleは「guest, user, admin」
の３種類をから、selectBoxによる選択で入力をさせます。selectBoxはformファザードを使いたいので

・コマンドプロンプトから、formファザードをプロジェクトに追加します。

```command.prompt
composer require "laravelcollective/html"
```

・formファザードを有効にする

続いて、templateでformファザードを使えるようにconfig\app.phpを編集します。

```config/app.php
  'providers' => [
    // ...
    Collective\Html\HtmlServiceProvider::class,
    // ...
  ],

   'aliases' => [
    // ...
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
    // ...
  ],
```

####(2)Registerを編集します。

Registerの画面に、userid,roleを追加します。

```resources\views\auth\register.blade.php
                        <div class="form-group row">
                            <label for="userid" class="col-md-4 col-form-label text-md-right">{{ __('userid') }}</label>

                            <div class="col-md-6">
                                <input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>

                                @if ($errors->has('userid'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('userid') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

<!--
・・・・
-->

                        <div class="form-group row">
                            <label for="role" class="col-md-4 col-form-label text-md-right">{{ __('role') }}</label>

                            <div class="col-md-6">
                                {{Form::select('role', ['admin', 'user', 'guest'], null, ['class' => 'form-control'])}}
                                @if ($errors->has('role'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('role') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>
```

####(3)useridによる認証を有効にする。

・app\User.phpのfillable に、userid, roleを追加します。

```app\User.php
    protected $fillable = [
        'name', 'userid', 'role', 'email', 'password',
    ];
```

####(4)ログイン画面で認証をメールアドレスから、useridに変更にする。

resources/views/auth/login.blade.phpを編集して、メールアドレスをuseridに変更します。

```resources/views/auth/login.blade.php
                        <div class="form-group">
                            <label for="userid" class="col-form-label">ユーザID</label>
                            <div class="">
                                <input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>
                                @if ($errors->has('userid'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('userid') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>
```

####(5)RegisterControllerにuseridを追加する

createメソッドにuseridを設定するよう編集します。
※2018/12/4追加しました。

```app\Http\Controllers\Auth\RegisterController.php
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'userid' => $data['userid'], // 追加
            'password' => Hash::make($data['password']),
        ]);
    }
```

これでユーザIDでログインして、roleによる権限でアプリの制御ができるようになります。