web-dev-qa-db-ja.com

Laravel:ルートミドルウェアとポリシーの違い

私はlaravelでアプリを開発していますが、Policyで実行できることはMiddlewareで正確に実行できることに気付きました。たとえば、情報の所有者でないユーザーがルートを更新できないようにしたい場合、ルートから簡単に確認でき、ポリシーから同じことができます。

だから私の質問は、なぜミドルウェアではなくpolicyを使用する必要があるのか​​、その逆も同様です

22

私は現在、自分の役割、権限、ルートを使用して小さなリファクタリングを行っており、同じ質問を自分に問いかけています。

表面的なレベルでは、真のミドルウェアとポリシーは同じ一般的な考え方を実行しているように見えます。ユーザーが自分のやっていることを実行できるかどうかを確認します。

参考までに、laravel docs ...

ミドルウェア「これを見てもいいですか?ここに行ってもいいですか?」

HTTPミドルウェアは、アプリケーションに入るHTTPリクエストをフィルタリングするための便利なメカニズムを提供します。たとえば、Laravelには、アプリケーションのユーザーが認証されていることを確認するミドルウェアが含まれています。ユーザーが認証されていない場合、ミドルウェアはユーザーをログイン画面にリダイレクトします。ただし、ユーザーが認証されると、ミドルウェアはリクエストをアプリケーションにさらに進めることができます。

もちろん、追加のミドルウェアを作成して、認証以外のさまざまなタスクを実行できます。 CORSミドルウェアが、アプリケーションを離れるすべての応答に適切なヘッダーを追加する必要がある場合があります。ロギングミドルウェアは、アプリケーションへのすべての受信リクエストをログに記録する場合があります。

https://laravel.com/docs/master/middleware#introduction

私の読書では、ミドルウェアは要求レベルで動作することについてです。 「このユーザーはページを参照できますか?」または「このユーザーはここで何かを実行できますか?」

もしそうなら、それはそのページに関連付けられたコントローラーメソッドに行きます。興味深いことに、ミドルウェアは、「はい、そこに行ってもかまいませんが、あなたが行っていることを書き留めておきます」と言うかもしれません。等。

それが終わったら。ユーザーが何をしているのかを制御することも、言うこともありません。別の言い方をすれば、それを仲買人だと思います。

ポリシー「これを実行できますか?これを変更できますか?」

Laravelは、すぐに認証サービスを提供することに加えて、承認ロジックを整理し、リソースへのアクセスを制御する簡単な方法を提供します。組織の整理に役立つさまざまな方法とヘルパーがあります。このドキュメントでは、認証ロジックについて説明します。

https://laravel.com/docs/master/authorization#introduction

ただし、ポリシーはの実行に関心を寄せているようです。ユーザーはエントリを更新できますか、それとも自分のエントリのみを更新できますか?

これらの質問は、リソースに対するアクションへのすべての呼び出しが整理されるコントローラーメソッドに適しているようです。このオブジェクトを取得し、記事を保存または更新します。

tjbbが言及 のように、ミドルウェアはルートを非常に乱雑にし、管理を困難にする可能性があります。これは私のルートファイルの例です:

問題

    Route::group(['middleware' =>'role:person_type,person_type2',], function () {
        Route::get('download-thing/{thing}', [
             'as' => 'download-thing', 
             'uses' => 'ThingController@download'
        ]);
    }); 

これは私のルートファイルを読むのが非常に難しくなります!

ポリシーを使用した別のアプローチ

//ThingController
public function download(Thing $thing)
{
    //Policy method and controller method match, no need to name it
    $this->authorize($thing);

    //download logic here....
}
48
GeraldBiggs

ルートミドルウェアを使用すると、すべてのコントローラーアクションでコードを繰り返す代わりに、リクエスト処理を広範囲のルートに適用できます。認証の確認とゲストのリダイレクトが良い例です。代わりに、コントローラーには特定のルート/アクションに固有のロジックが含まれています。これにはミドルウェアを使用できますが、すべてのルートのロジックに個別のミドルウェアが必要であり、すべてが非常に複雑になります。

ポリシー/機能は、ユーザーの権限を確認する方法の1つにすぎません。コントローラー、ミドルウェア、またはその他の場所からそれらを照会できます。これらはtrueまたはfalseのみを返すため、コントローラーやミドルウェアと同等ではありません。ほとんどの場合、機能はユーザーを別のモデルと比較することになります。別のモデルは、コントローラーアクションに送信された識別子に基づいて読み込まれますが、ミドルウェアで使用するアプリケーションもおそらく存在します。

17
tjbp