見出し画像

【Laravel 7.x】Gate機能を使ってユーザー認証を作る(権限機能)

はじめに

例えば、エンドユーザーにしか編集できない項目と管理者にしか編集できない項目がある時に、この機能が使えます。

php artisanで管理者を作ってもよいのですが、例えば社内で使うツールの場合だと色々めんどくさく、そもそも管理画面っていらなくね?って感じなので、それとは別のやり方で行います。

参考記事

やり方

これでまずカラム追加のマイグレーションファイルを作成します。

php artisan make:migration add_column_role_users_table --table=users

生成されたマイグレーションファイルを編集します。

public function up()
{
   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');
   });
}

roleというカラムを追加しました。権限をuserが持っている数字で分けていくので、デフォルトは0にしておきます。

編集出来たらマイグレーション実行

php artisan migrate

権限の設定を行っていく

AuthServiceProvider.phpの中のbootメソッドの中に記載する。

public function boot()
{
   $this->registerPolicies();
   //
   // 管理者以上(つまり role=1)に許可
   Gate::define('admin-higher', function ($user) {
       return ($user->role == 1);
   });
   // 開発者or上層部以上(つまり role=1~5)に許可
   Gate::define('dev-higher', function ($user) {
       return ($user->role >= 1 && $user->role <= 5);
   });
   // 一般ユーザ以上(つまり role=0~10)に許可
   Gate::define('user-higher', function ($user) {
       return ($user->role >= 1 && $user->role <= 10 || $user->role == 0);
   });
}

これで設定は完了です。

あとはuser編集の画面を作ってroleの部分のフォームを作って、@canという権限を分けることができる

もし管理者だけ表示させたい部分があれば

@can('admin-higher')
    <a href="{{ route('user.edit', ['id' => $user->id]) }}">
       <i class="fas fa-edit"></i>
    </a>
@endcan

とすれば role=1の管理者にしかここの部分は表示されない。

また、そもそもアクセスすらさせないようにするには

Route::group(['prefix' => 'user', 'middleware' => ['auth', 'can:dev-higher']], function () {
   Route::get('', 'UserController@index')->name('user.index');
});

こんな感じで auth の後に権限名を書けば良い。

以上です。



この記事が気に入ったらサポートをしてみませんか?