認可
はじめに
Laravelは組み込みの認証サービスを提供するだけでなく、特定のリソースに対するユーザーアクションの認可を簡単に行う方法を提 供します。たとえば、ユーザーが認証されていても、特定のEloquentモデルやアプリケーションが管理するデータベースレコードを更新または削除する権限がない場合があります。Laravelの認可機能は、この種の認可チェックを簡単かつ整理された方法で管理する手段を提供します。
Laravelには、アクションを認可するための主要な方法が2つあります:ゲートとポリシー。ゲートとポリシーは、ルートとコントローラーのように考えることができます。ゲートは、クロージャベースのシンプルな認可アプローチを提供し、ポリシーは、コントローラーのように、特定のモデルやリソースにロジックをグループ化します。このドキュメントでは、まずゲートを探求し、その後にポリシーを検討します。
アプリケーションを構築する際に、ゲートのみを使用するか、ポリシーのみを使用するかを選択する必要はありません。ほとんどのアプリケーションは、おそらくゲートとポリシーの混合物を含むでしょうが、それは完全に問題ありません!ゲートは、モデルやリソースに関連しないアクションに最も適しており、管理者ダッシュボードを表示するなどの場合に使用されます。一方、特定のモデルやリソースのアクションを認可する場合は、ポリシーを使用する必要があります。
ゲート
ゲートの書き方
ゲートは、Laravelの認可機能の基本を学ぶための素晴らしい方法です。ただし、堅牢なLaravelアプリケーションを構築する際には、認可ルールを整理するためにpoliciesを使用することを検討する必要があります。
ゲートは、ユーザーが特定のアクションを実行する権限があるかどうかを決定する単なるクロージャです。通常、ゲートは、Gate
ファサードを使用してApp\Providers\AppServiceProvider
クラスのboot
メソッド内で定義されます。ゲートは常にユーザーインスタンスを最初の引数として受け取り、関連するEloquentモデルなどの追加の引数をオプションで受け取ることができます。
この例では、ユーザーが指定されたApp\Models\Post
モデルを更新できるかどうかを決定するゲートを定義します。このゲートは、ユーザーのid
を投稿を作成したユーザーのuser_id
と比較することで達成されます:
use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Gate::define('update-post', function (User $user, Post $post) {
return $user->id === $post->user_id;
});
}