ホームページ > 記事 > PHPフレームワーク > Laravel のインターセプター (Gates) について話しましょう
Laravel Gates (インターセプター) を使用すると、ユーザーがアプリケーションの特定の領域にアクセスすることを承認できます。アプリケーションでインターセプタを簡単に定義し、それを使用してアクセスを許可または拒否できます。
ユーザー テーブルに admin
という名前の列があるとします。ユーザーが管理者であるかどうかに応じて、次のことができます。 1
または 0
です。次のような簡単なチェックを行うことで、アプリケーションの一部であるモジュールを簡単に保護できます。
Route::get('administration', function(){ if(auth()->check() && auth()->user()->admin){ echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
特定のユーザーの admin
行が 1
に設定されている場合、次の出力が表示されます。
そうしないと、次のようなメッセージが表示されます:
これは素晴らしいですね!アプリケーションの特定の部分へのアクセスを許可または拒否する簡単な方法があります。ただし、問題は、アプリケーション全体でユーザーのアクセス許可を確認および変更する必要がある場所が多数ある場合はどうなるかということです。コードをグローバルに検索し、あらゆる場所でこのロジックを変更する必要があります。あまり効率的ではありません。
このために、ゲート (インターセプター) を定義し、アプリケーション全体でそれを使用できます。
インターセプターを定義するには、App\Providers\AuthServiceProvider.php
ファイルを開き、 boot ()
次の内容をメソッドに追加します。
public function boot() { $this->registerPolicies(); Gate::define('access-admin', function ($user) { return $user->admin; }); }
このインターセプターは、管理者ユーザーを認証するアプリケーション全体のどこでも使用できます。次のセクションでは、この新しいインターセプターをどのように使用するかを見ていきます。
インターセプターを使用するには、Gate::allows()
または Gate::denies( )# を呼び出します。 ## メソッド、以下に示すように:
Route::get('administration', function(){ if (Gate::allows('access-admin')) { echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
注意してください:インターセプタを実行することの利点は、いつでも定義を変更できるようになり、認可ロジックがアプリケーション全体で同期して変更されることです。 インターセプターを使用するもう 1 つの目的は、データに関連するアクセス許可を確認することです。ブログを例に挙げると、ユーザーが作成した投稿に対する編集権限を付与できます。 データをインターセプターに渡して、ユーザーがアクションを実行する権限を持っているかどうかを確認できます。Gate::denies()
メソッドは
Gate::allows()を実行します。逆引きチェック
user_id という列を持つ Post テーブルがあるとします。作成したユーザーの
ID。次のようにゲート (インターセプター) を定義して、ユーザーが特定の投稿を編集できるかどうかを決定できます。
Gate::define('edit-post', function ($user, $post) { return $user->id === $post->user_id; });2 つのパラメーターがインターセプター定義に渡されます。 1 つ目は認証されたユーザーを含む
$user オブジェクトで、2 つ目のパラメータは
$post オブジェクトです。
ヒント: 認証されたユーザーが存在しない場合、インターセプターは false を返します。インターセプタは、認証されたユーザーが元の作成者であればアクセスを許可しますが、それ以外の場合はアクセスを拒否します。 これは、新しい
edit-post インターセプターの使用方法の簡単な例です。
Route::get('edit/{id}', function($id){ $post = \App\Model\Post::find($id); if( Gate::allows('edit-post', $post) ){ echo 'You can edit this post'; } else { echo 'You shall not pass'; } });上の例では
Route Closures を使用しましたが、このルートをコントローラーにマップすることもできます。これにより、新しい Authorize 関数も使用できるようになります。
Route::get('edit/{id}', 'PostController@edit');
authorize() ヘルパーを使用して、認証されたユーザーに投稿を編集する権限があるかどうかを確認できます。
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function edit($id){ $post = Post::find($id); $this->authorize('edit-post', $post); } }コントローラーが
App\Http\Controllers\Controller 基本クラスから継承している場合は、
Gate::allow()## と同じように 関数を使用できます。 # function authorize()
ヘルパー関数。 最後に、ビューで承認を確認したい場合はどうすればよいでしょうか?これは、
Blade 関数ヘルパーを使用して行うことができます。
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p>
ブレード ヘルパー関数を使用できます
@ can 現在のユーザーがこの投稿の編集を許可されているかどうかを確認します: <pre class="brush:php;toolbar:false">nbsp;html>
<meta>
<meta>
<title>{{ $post->title }}</title>
<h1>{{ $post->title }}</h1>
<p>{!! $post->body !!}</p>
@can('edit-post', $post)
<a>id }}">Edit Post</a>
@endcan
</pre>
認証されたユーザーが投稿の元の作成者である場合、「
」ボタンが表示されます。
@can ヘルパー関数を使用すると、コードの読み取りと管理が容易になります。 @cannot
を使用して操作を元に戻すこともできます。
しかし、物事を複雑にしすぎないでください... 最も単純なシナリオでは、アクセスを許可または拒否するために Interceptors が使用されます。ユーザーは、認可を許可されることも拒否されることもできます。
このチュートリアルは、ユーザーに理解してもらうことではなく、理解してもらうことを目的としているため、ロード オブ ザ リングのガンダルフの画像 (手動の犬の頭) を送信するのは理にかなっています。
Laravel Gates (インターセプター) の詳細については、必ず Larav 認証ドキュメントを参照してください。
英語のオリジナルアドレス: https://devdojo.com/tnylea/laravel-gates
翻訳アドレス: https://learnku.com/laravel/t/67585
[関連する推奨事項: laravel ビデオチュートリアル]
以上がLaravel のインターセプター (Gates) について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。