web-dev-qa-db-fra.com

Laravel: Différence entre le middleware de route et la politique

Je développe une application avec laravel, j'ai réalisé que ce qui peut être fait avec Policy peut exactement être fait avec Middleware. Supposons que je souhaite empêcher un utilisateur de mettre à jour un itinéraire s'il n'est pas le propriétaire des informations, je peux facilement vérifier à partir de l'itinéraire et faire de même à partir de la politique.

Donc ma question est pourquoi devrais-je utiliser policy sur le middleware et vice versa

22
James Okpe George

Je passe actuellement par un petit refactor avec mes rôles, autorisations et itinéraires et me suis posé la même question.

Au niveau de la surface, il semble que le véritable middleware et les politiques aient la même idée générale. Vérifiez si un utilisateur peut faire ce qu'il fait.

Pour référence, voici les documents laravel ...

Middleware "Puis-je voir cela? Puis-je aller ici?"

L'intergiciel HTTP fournit un mécanisme pratique pour filtrer les requêtes HTTP entrant dans votre application. Par exemple, Laravel inclut un middleware qui vérifie que l'utilisateur de votre application est authentifié. Si l'utilisateur n'est pas authentifié, le middleware redirigera l'utilisateur vers l'écran de connexion. Cependant, si l'utilisateur est authentifié, le middleware permettra à la demande d'aller plus loin dans l'application.

Bien sûr, un middleware supplémentaire peut être écrit pour effectuer une variété de tâches en plus de l'authentification. Un middleware CORS peut être chargé d'ajouter les en-têtes appropriés à toutes les réponses quittant votre application. Un middleware de journalisation peut consigner toutes les demandes entrantes dans votre application.

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

À mon avis, le middleware consiste à fonctionner au niveau de la demande. Dans les termes de "Cet utilisateur peut-il voir une page?", Ou "Cet utilisateur peut-il faire quelque chose ici?"

Si c'est le cas, il passe à la méthode du contrôleur associée à cette page. Chose intéressante, Middleware peut dire: "Oui, vous pouvez y aller, mais je vais écrire que vous y allez." Etc.

Une fois que c'est fait. Il n'a plus de contrôle ou de dire ce que fait l'utilisateur. Une autre façon dont je pense à lui en tant qu'intermédiaire.

Politiques "Puis-je faire cela? Puis-je changer cela?"

En plus de fournir des services d'authentification prêts à l'emploi, Laravel fournit également un moyen simple d'organiser la logique d'autorisation et de contrôler l'accès aux ressources. Il existe une variété de méthodes et d'aides pour vous aider à organiser votre logique d'autorisation, et nous allons couvrir chacun d'eux dans ce document.

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

Cependant, les politiques semblent être plus préoccupées par faire. L'utilisateur peut-il mettre à jour n'importe quelle entrée, ou seulement la leur?

Ces questions semblent adaptées à une méthode de contrôleur où tous les appels à l'action sur une ressource sont organisés. Récupérez cet objet, stockez ou mettez à jour l'article.

Comme mentionné par tjbb , le middleware peut rendre les routes très compliquées et difficiles à gérer. Voici un exemple de mon fichier de routes:

Le problème

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

Cela devient très difficile à lire dans mon fichier d'itinéraire!

Une autre approche avec des politiques

//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

L'intergiciel de route vous permet d'appliquer la gestion des demandes à une large gamme de routes, au lieu de répéter le code dans chaque action du contrôleur - la vérification de l'authentification et la redirection des invités en est un bon exemple. Les contrôleurs contiennent à la place une logique unique pour des routes/actions spécifiques - vous pouvez utiliser un middleware pour cela, mais vous auriez besoin d'un middleware séparé pour la logique de chaque route et tout deviendrait très compliqué.

Les stratégies/capacités sont simplement un moyen de vérifier les autorisations des utilisateurs - vous pouvez les interroger à partir d'un contrôleur, ou d'un middleware, ou n'importe où ailleurs. Ils ne renvoient que true ou false, ils ne sont donc pas équivalents aux contrôleurs ou middleware. La plupart du temps, les capacités compareront un utilisateur à un autre modèle, qui aura été chargé en fonction d'un identifiant envoyé à une action de contrôleur, mais il existe probablement certaines applications à utiliser avec le middleware également.

17
tjbp