Gate:シンプルな認可チェック
ユーザーの操作権限を判定するGateを定義・評価します
「Gate:シンプルな認可チェック」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
Gateとは
LaravelのGateは、ユーザーが特定のアクションを実行する権限を持っているかどうかを判定するクロージャです。特定のモデルに結び付かない、シンプルでグローバルな認可チェックに使用します。
Gateの定義
App\Providers\AppServiceProviderまたは専用のAuthServiceProviderで、Gateファサードを使用してGateを定義します。
<?php
use Illuminate\Support\Facades\Gate;
// In a service provider's boot() method:
Gate::define("delete-post", function (User $user, Post $post) {
return $user->id === $post->user_id;
});Gateのチェック(許可/拒否)
Gate::allows()またはGate::denies()でGateの結果をチェックします。
<?php
if (Gate::allows("delete-post", $post)) {
$post->delete();
}
if (Gate::denies("delete-post", $post)) {
abort(403);
}コントローラーでのauthorize()
コントローラー内で$this->authorize()を呼び出すと、失敗時にAuthorizationException(403)が自動的にスローされます。
<?php
public function destroy(Post $post): RedirectResponse
{
$this->authorize("delete-post", $post);
$post->delete();
return redirect()->route("posts.index");
}Bladeでの@can
@canディレクティブを使用すると、Gateのチェック結果に応じてUIを表示できます。
@can('delete-post', $post)
<form method="POST" action="/posts/{{ $post->id }}">
@csrf @method('DELETE')
<button>Delete</button>
</form>
@endcanGate::before
beforeコールバックは、他のすべてのGateチェックより前に実行されます。管理者に無条件のアクセス権を与える場合などに便利です。
<?php
Gate::before(function (User $user, string $ability) {
if ($user->isAdmin()) return true; // skip further checks
});Gate::after
afterは、すべてのGateチェックの後に実行されます。null以外の戻り値を返すと、Gateの結果が上書きされます。
レスポンスの返却
GateはResponseオブジェクトを返して、カスタムエラーメッセージを指定できます。
<?php
Gate::define("publish-post", function (User $user, Post $post) {
return $user->isEditor()
? Response::allow()
: Response::deny("You must be an editor to publish.");
});forUser()
認証済みユーザーではなく、別のユーザーに対してGateをチェックします。
<?php
if (Gate::forUser($otherUser)->allows("delete-post", $post)) {
// ...
}ゲストユーザー
デフォルトでは、Gateは未認証ユーザーに対して自動的にfalseを返します。ユーザーをnullableとして型指定すると、ゲストに対するチェックが可能になります。
<?php
Gate::define("view-post", function (?User $user, Post $post) {
return $post->is_published || $user?->id === $post->user_id;
});GateとPolicyの違い
Gateは、その場で行うチェックのためのシンプルなクロージャです。Policyはモデルベースの認可を行うクラスです。同じモデルに対して複数のアクションがある場合は、Policyを使用します。
概要
Gateはグローバルな認可用クロージャです。サービスプロバイダーで定義し、BladeではGate::allows()、$this->authorize()、または@canでチェックします。
クイックチェック
Gateのチェックに失敗したとき、自動的に403をスローするコントローラーメソッドはどれですか?
よくある質問
「Gate:シンプルな認可チェック」レッスンは無料ですか?
はい。「Gate:シンプルな認可チェック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「Gate:シンプルな認可チェック」で何を学びますか?
ユーザーの操作権限を判定するGateを定義・評価します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Gate:シンプルな認可チェック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Laravel Breezeによる認証
- ミドルウェアでルートを保護する
- Gate:シンプルな認可チェック
- Policy:モデルベースの認可