【Laravel】【ホテル予約管理】ユーザーの権限管理を行う

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、お次の課題は、

  • 一般ユーザーからでも予約登録ができる
  • レスポンシブ対応にする

です。

で、そのために必要になるのが、ユーザーの権限管理というものです。

具体的には、管理者用のアカウントを登録して、管理者アカウントからは今までのフル機能が使用できる。

その一方で、通常ユーザーの場合は、一部の機能だけが使用できる、という感じです。

Laravelの権限管理の方法は色々あるようですが、今回は一番簡単なGATEを使用した方法を採用しようと思います。

この方法なら、新たに特別なプラグインを使用する必要がないためです。

では、Userテーブルに還元を管理するカラムroleを追加します。

$ php artisan make:migration add_column_role_users_table --table=users
class AddColumnRoleUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->tinyInteger('role')->default(0)->after('password');
        });
    }

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

単純にrole=0が一般ユーザー、role=1が管理者アカウントとします。

では、Seederを使用して、管理者アカウントを予め追加しておきます。

(これを行わないと、管理者権限を与えるユーザーが存在しないことになるので、運用できません!)

$ php artisan make:seeder UsersTableSeeder
class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'manager',
            'email' => 'manager@gmail.com',
            'password' => bcrypt('manager'),
            'role' => 1,
        ]);
    }
}
$ composer dump-autoload
$ php artisan db:seed --class=UsersTableSeeder

登録できました。

次は、AuthServiceProviderのboot()に処理を追加して、GATEによる権限の定義を記入します。

    public function boot()
    {
        $this->registerPolicies();

        Gate::define('manager', function ($user) {
            return ($user->role == 1);
        });
        Gate::define('user', function ($user) {
            return ($user->role == 0);
        });
    }

これで、role=1(manager)、role=0(user)がGATEによって定義されました。

では、Viewを書き換えて、一般ユーザーには不要なメニューを表示させないようにします。

<div class="panel-body">
    <detail-component></detail-component>
    <div>{{ Html::Link('/management/create', '追加', ['class' => 'btn']) }}</div>
</div>
@can('manager')
<div>{{ Html::link('/management/schedule', 'スケジュール', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/management/total', '集計', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/room', '部屋一覧へ', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/management/checkout', '本日のチェックアウト', ['class' => 'btn']) }}</div>
@endcan

ポイントは@can(権限)〜@canend。

@can(権限)に権限の名前を入れることで、ユーザーの権限に対して@can(権限)〜@canendの表示を切り替えることができます。

manager権限

一般ユーザー

こんな感じで、表示の切り替えができました。

では、次回からは一般ユーザーの使い勝手がいいように修正していきましょうか。