最新ソースはこちら(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権限
一般ユーザー
こんな感じで、表示の切り替えができました。
では、次回からは一般ユーザーの使い勝手がいいように修正していきましょうか。