ブログ
 

【Laravel】認可 Gateの使い方

       

Laravelの認可はシンプルで、主にGate(ゲート)とPolicy(ポリシー)という2つの認可アクションの方法があります。

以前の記事では、Policyの説明をしましたが、今回はGateについてまとめています。
GateはPolicyと異なり、特定のモデルに関係のないものに対してアクセス制限をしたい際に使用します。例えば、投稿された記事の編集や削除ボタンの表示を制限したり、管理者のみがアクセスできる画面の閲覧制限をするといった際にGateを利用します。

Gateの作成

「App\Providers\AuthServiceProvider」クラスの「boot」メソッド内に定義を行います。
以下の例では、ログインしたユーザーが特定の記事($post)に対して、更新処理が可能かを判断できるGateを定義しています。第一引数にはGateのアクセス制限の名前(自由設定)、第二引数にはクロージャを設定します。クロージャの戻り値はtrueもしくはfalseを設定します。

namespace namespace App\Providers;

class AuthServiceProvider extends ServiceProvider
{
          
     /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        
        // 以下を追加
        Gate::define('update-post', function (User $user, Post $post) {
            return $user->id === $post->user_id;
        });
    }
}

Bladeでの利用

Gateの作成ができたら、@canを利用してbladeファイルに認可を記述します。

@can('update-post', $post)
    
@else
    
@endcan
---------------------------------------------
@cannot('update', $post)
    
@else
    
@endcannot

Controllerでの利用

Controllerに記述する場合は、以下のようになります。今回は「authorize」メソッドを使用しましたが、allowsメソッド、deniesメソッド等も存在しますので興味のある方は試してみてください。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use Gate;

class UserController extends Controller
{
    public function update($id){
        $post = Post::findOrFail($id);
        Gate::authorize('update-post', $post); // 追加

	return view('users.index',compact('users'));   
        }
}

authorizeメソッドでは戻り値がfalseの場合、403のAuthorizationExceptionがthrowされます。

その他の方法

これまでGateを「App\Providers\AuthServiceProvider」クラスの「boot」メソッド内に定義してきましたが、新しくApp配下にGateフォルダを作成して呼び出すことも可能です。Gateのクロージャが長くなってしまう場合に利用すると可読性が上がるのではないかと思います。

namespace namespace App\Providers;

class AuthServiceProvider extends ServiceProvider
{
          
     /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        
        // 以下を追加
        Gate::define('update-post', 'App\Gates\PostGate@update');
    }
}
namespace App\Gates;

use App\Models\User;
use App\Models\Post;

class PostGate
{
    public function create(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

最後に

Webアプリを実装する際に、認可はとても大切な機能だと思っています。Laravelの認可機能は、とても簡単で実装しやすいので是非試してみてください。

 
  • このエントリーをはてなブックマークに追加