Laravel ロールの設定

Laravelでロールを設定する方法についてご紹介します。
今回はuserテーブルにロールカラムを追加する方法と、ユーザーへの役割の設定方法までを記載致します。
現在作成中のポートフォリオで、ログインをロールで認可してユーザー権限ごとにログイン後のリダレクト先を変更する機能を実装中なので、実装が終わったらそちらの方もご紹介できればと思います！

##ロールとは
システム開発において`ロール`とは`役割`という意味ですが、一般的に権限といった言葉で表現されています。
userアカウントを作成した際に、ロールが設定してあることで、このアカウントは`一般ユーザーなのか、管理者なのか`といったアカウントの役割を区別することが可能になります！

ロールの設定をすれば、ログインした際にロールからアカウントの権限を区別し、一般ユーザーや管理者ごとにブラウザの表示内容を変えることができます！

##ロール設定の前に
今回は下記の権限を想定の上で、数値を使ったロールの設定を行います。
数値以外には、文字列でも設定可能です。

「管理者(admin）」
・アプリを管理する用のアカウント。主に、登録してある一般ユーザーアカウントの管理等を行う。
・ロール→1〜10　
（`権限ごとにアカウントを追加する時に対応しやすいようロール値は余裕を持たせておきます。`）
「一般ユーザ（user）」
・アプリを利用する人用のアカウント。
・ロール→11以降

今回は管理者と一般ユーザーの二つの権限を想定してますが、実際のシステム開発になると、この二つに加えて`システム管理者`といった権限も作成したりするようです。
管理者でも使えないような機能を使えるように用意するみたいですね！

##ロールカラムの追加
1.先ずは、権限を管理する為にuserテーブルにロール（権限）カラムを追加します。

```
//artisanコマンドでマイグレーションファイルを生成
php artisan make:migration add_column_role_users_table --table=users

↓　/database/migrations配下にファイルが生成されます。

├─ database
│   ├─ migrations
│   │   ├─ 2014_10_12_000000_create_users_table.php
│   │   ├─ 2014_10_12_100000_create_password_resets_table.php
│   │   └─ 2018_08_02_122201_add_column_role_users_table.php
```

2.次に`add_column_role_users_table.php` を開き、ロールカラムを追加する為に以下を記述します。

```/database/migrations/add_column_role_users_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddColumnRoleUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //roleカラムをTINYINT型でpasswordカラムの後に追加。更にインデックスを付与。
        Schema::table('users', function (Blueprint $table) {
          $table->tinyInteger('role')->default(0)->after('password')->index('index_role')->comment('ロール');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
          $table->dropColumn('role');
        });
    }
}
```

3.記述が完了したらマイグレーションを実行し、テーブルにカラムを追加。

```
//artisanコマンドでマイグレーションを実行
php artisan migrate

//実行結果
# php artisan migrate
Migrating: 2018_01_14_122201_add_column_role_users_table
Migrated:  2018_01_14_122201_add_column_role_users_table]
```

4.MySQLにログインして、カラムが追加されているか確認してみましょう！
ロールカラムが追加されていれば成功です！

##ゲートを定義
次に権限の設定を行います。

権限の設定方法については複数あるようですが、今回はLaravelのGate（ゲート）と呼ばれる機能を用いて実装していきます。

5.`AuthServiceProvider.php` ファイルを開きます。

```/app/Providers/AuthServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
      $this->registerPolicies();

      // 管理者以上に許可
      Gate::define('admin-higher', function ($user) {
        return ($user->role >= 1 && $user->role <= 10);
      });
      // 一般ユーザー以上に許可
      Gate::define('user-higher', function ($user) {
        return ($user->role > 10 && $user->role <= 100);
      });
    }
}
```

##ルーティングの設定
ルーティングは下記のようにミドルウェアを使って設定することで、ユーザー権限ごとにルーティングを設定することができます。

```
//一般ユーザー
Route::group(['middleware' => ['auth', 'can:user-higher']], function () {
  //ここにルートを記述
});

// 管理者以上
Route::group(['middleware' => ['auth', 'can:admin-higher']], function () {
  //ここにルートを記述
});
```

##ビューの切り分け
viewでは下記のようにBladeテンプレートを使って実装することで、ユーザー権限ごとに表示内容を切り分けることができます。

```/views/list.blade.php
    @can('admin-higher')　{{-- 管理者に表示される --}}
      //ビューを記述
    @elsecan('user-higher') {{-- 一般ユーザーに表示される --}}
      //ビューを記述
    @endcan
```

##まとめ
これでロールの設定は以上になります！
より詳しく知りたい方は下記の参考サイトをご覧になってみてください。
近々、「ロールを使ったログイン後のリダイレクト先の変更方法」について投稿しようと思いますので、そちらもご覧になっていただけると幸いです！

参考サイト
https://www.ritolab.com/entry/56#aj_2