見出し画像

Laravel学習記録 #037 Gateを学ぶ

LaravelのGateについて学習したものをまとめています。


Gateとは

  • 認証済みユーザー権限など認可を判定する機能

  • App\Providers\AuthServiceProviderで定義される

  • Gateファサードを使用してAuthServiceProviderのbootメソッド内で定義


Gateを試してみる

Gate定義

認可タイプとして、roleが1,2の場合ならOKのものと3であればOKの2タイプ定義してみます。
defineメソッドの第一引数にGateの名前、第二引数にクロージャを取ります。

<?php

namespace App\Providers;

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

class AuthServiceProvider extends ServiceProvider
{

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

        // Gateの定義
        Gate::define('role-typeA', function ($user) {
            return in_array($user->role, [1, 2]);
        });
    
        Gate::define('role-typeB', function ($user) {
            return $user->role == 3;
        });
    }
}


呼び出す

使用する場合以下のようにallowsメソッドで使用できます。
第一引数に定義した名前を指定して利用します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;

class ExampleController extends Controller
{
    public function handleRequest(Request $request)
    {
        // role-1-2のアビリティをチェック
        if (Gate::allows('role-typeA')) {
            // 1, 2の権限を持つユーザー向けの処理
            return response()->json(['message' => '権限が1or2']);
        }

        // role-3のアビリティをチェック
        if (Gate::allows('role-typeB')) {
            // 3の権限を持つユーザー向けの処理
            return response()->json(['message' => '権限が3']);
        }

        // 権限がない場合の処理
        return response()->json(['message' => '許可されていません'], 403);
    }
}

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