Portes et politiques à Laravel

Aujourd'hui, nous allons discuter du système d'autorisation du framework Web Laravel. Le framework Laravel implémente les autorisations sous forme de portes et de règles. Après une introduction aux gates et aux stratégies, je vais démontrer les concepts en implémentant un exemple personnalisé..

Je suppose que vous connaissez déjà le système d’authentification Laravel intégré car c’est un élément essentiel pour comprendre le concept d’autorisation. De toute évidence, le système d'autorisation fonctionne conjointement avec le système d'authentification afin d'identifier la session d'utilisateur légitime.

Si vous n'êtes pas au courant du système d'authentification Laravel, je vous recommande vivement de consulter la documentation officielle, qui vous fournit un aperçu pratique du sujet..

L'approche de Laravel en matière d'autorisation

A présent, vous devez déjà savoir que le système d'autorisation Laravel est disponible en deux versions: stratégies et stratégies. Bien que cela puisse sembler compliqué, je dirais que c'est assez facile à mettre en œuvre une fois que vous maîtrisez la situation.!

Les portes vous permettent de définir une règle d'autorisation à l'aide d'une approche simple basée sur la fermeture. En d'autres termes, lorsque vous souhaitez autoriser une action qui n'est pas liée à un modèle spécifique, la porte est l'endroit idéal pour mettre en œuvre cette logique..

Examinons rapidement à quoi ressemble l'autorisation basée sur la porte:

… Gate :: define ('update-post', fonction ($ utilisateur, $ post) retour $ utilisateur-> id == $ post-> utilisateur_id;);… 

L'extrait ci-dessus définit la règle d'autorisation post de mise à jour que vous pouvez appeler de n'importe où dans votre application.

D'autre part, vous devez utiliser des stratégies lorsque vous souhaitez regrouper la logique d'autorisation d'un modèle. Par exemple, supposons que vous ayez un modèle Post dans votre application et que vous souhaitiez autoriser les actions CRUD de ce modèle. Dans ce cas, c'est la politique que vous devez implémenter.

classe PostPolicy vue de la fonction publique (utilisateur $ utilisateur, publication $ post)  fonction publique create (utilisateur $ utilisateur)  mise à jour de la fonction publique (utilisateur $ utilisateur, publication $ post)  fonction publique suppression (utilisateur $ utilisateur, publication $ post) 

Comme vous pouvez le constater, il s’agit d’une classe de règles assez simple qui définit l’autorisation pour les actions CRUD du Poster modèle.

C'était donc une introduction aux barrières et aux politiques de Laravel. Dans la section suivante, nous allons passer en revue une démonstration pratique de chaque élément..

portes

Dans cette section, nous allons voir un exemple concret pour comprendre le concept de portes..

Le plus souvent, vous finissez par consulter le fournisseur de services Laravel lorsque vous devez enregistrer un composant ou un service. Suivant cette convention, allons de l'avant et définissons notre portail personnalisé dans le app / Providers / AuthServiceProvider.php comme indiqué dans l'extrait suivant.

 'App \ Policies \ ModelPolicy',]; / ** * Enregistrez tous les services d'authentification / autorisation. * * @return void * / public function boot () $ this-> registerPolicies (); Gate :: define ('update-post', fonction ($ user, $ post) return $ user-> id == $ post-> user_id;); 

dans le démarrage méthode, nous avons défini notre porte personnalisée:

Gate :: define ('update-post', fonction ($ user, $ post) return $ user-> id == $ post-> user_id;);

Lors de la définition d'une porte, il faut une fermeture qui renvoie VRAI ou FAUX sur la base de la logique d'autorisation définie dans la définition de la porte. Outre la fonction de fermeture, il y a d'autres façons de définir les portes.

Par exemple, la définition de porte suivante appelle l'action de l'automate au lieu de la fonction de fermeture..

Gate :: define ('update-post', 'Nom du contrôleur @ Nom de la méthode');

A présent, ajoutons un itinéraire personnalisé pour pouvoir montrer comment fonctionne l'autorisation basée sur la porte. Dans le fichier des routes routes / web.php, ajoutons l'itinéraire suivant.

Route :: get ('service / post / gate', 'PostController @ gate');

Créons un fichier de contrôleur associé app / Http / Controllers / PostController.php ainsi que.

Dans la plupart des cas, vous finirez par utiliser le permet ou nie méthode du Porte façade pour autoriser une certaine action. Dans notre exemple ci-dessus, nous avons utilisé le permet méthode pour vérifier si l'utilisateur actuel est capable d'effectuer post de mise à jour action.

Les utilisateurs avec des yeux vifs auraient remarqué que nous avons seulement passé le deuxième argument $ post à la fermeture. Le premier argument, l'utilisateur actuellement connecté, est automatiquement injecté par le Porte façade.

C'est ainsi que vous êtes censé utiliser des portes pour autoriser des actions dans votre application Laravel. La section suivante traite de l'utilisation des stratégies, si vous souhaitez implémenter une autorisation pour vos modèles..

Politiques

Comme nous en avons discuté précédemment, lorsque vous souhaitez regrouper logiquement vos actions d'autorisation pour un modèle ou une ressource en particulier, c'est la stratégie que vous recherchez..

Dans cette section, nous allons créer une stratégie pour le modèle Post qui sera utilisée pour autoriser toutes les actions CRUD. Je suppose que vous avez déjà implémenté le modèle Post dans votre application; sinon, quelque chose de similaire fera.

Le Laravel artisan La commande est votre meilleur ami pour créer du code abrégé. Vous pouvez utiliser la commande artisan suivante pour créer une stratégie pour le modèle Post.

$ php artisan marque: politique PostPolicy --model = Post

Comme vous pouvez le voir, nous avons fourni le --model = Post argument pour qu'il crée toutes les méthodes CRUD. En l'absence de cela, une classe de stratégie vide sera créée. Vous pouvez localiser la classe Policy nouvellement créée à l'adresse suivante: app / Politiques / PostPolicy.php.

Remplaçons-le par le code suivant.

id> 0;  / ** * Détermine si l'utilisateur peut mettre à jour le message. * * @param \ App \ Utilisateur $ utilisateur * @param \ App \ Post $ post * @return mixte * / mise à jour d'une fonction publique (Utilisateur $ utilisateur, Post $ post) return $ utilisateur-> id == $ post-> identifiant d'utilisateur;  / ** * Détermine si l'utilisateur peut supprimer le message. * * @param \ App \ Utilisateur $ utilisateur * @param \ App \ Post $ post * @return mélangé * / fonction publique delete (User $ user, Post $ post) return $ user-> id == $ post-> identifiant d'utilisateur; 

Pour pouvoir utiliser notre classe Policy, nous devons l'enregistrer à l'aide du fournisseur de services Laravel, comme indiqué dans l'extrait suivant..

 'App \ Policies \ ModelPolicy', Post :: class => PostPolicy :: class]; / ** * Enregistrez tous les services d'authentification / autorisation. * * @return void * / public function boot () $ this-> registerPolicies (); 

Nous avons ajouté la cartographie de notre politique dans le $ politiques propriété. Il demande à Laravel d’appeler la méthode politique correspondante pour autoriser l’action CRUD..

Vous devez également enregistrer les stratégies à l'aide de la s'inscrirePolitiques méthode, comme nous l'avons fait dans le démarrage méthode.

Pour aller plus loin, créons deux itinéraires personnalisés dans le routes / web.php déposer afin que nous puissions tester nos méthodes de politique là-bas.

Route :: get ('service / post / view', 'PostController @ view'); Route :: get ('service / post / create', 'PostController @ create'); Route :: get ('service / post / update', 'PostController @ update'); Route :: get ('service / post / delete', 'PostController @ delete');

Enfin, créons un contrôleur associé à app / Http / Controllers / PostController.php.

can ('view', $ post)) echo "L’utilisateur actuellement connecté est autorisé à mettre à jour le message: $ post-> id";  else echo 'Non autorisé.';  fonction publique create () // récupère l'utilisateur actuellement connecté $ user = Auth :: user (); if ($ user-> can ('create', Post :: class)) echo 'L'utilisateur actuellement connecté est autorisé à créer de nouveaux articles.';  else echo 'Non autorisé';  sortie;  public function update () // récupère l'utilisateur actuellement connecté $ user = Auth :: user (); // charge le poste $ post = Post :: find (1); if ($ user-> can ('update', $ post)) echo "L'utilisateur actuellement connecté est autorisé à mettre à jour le message: $ post-> id";  else echo 'Non autorisé.';  public function delete () // récupère l'utilisateur actuellement connecté $ user = Auth :: user (); // charge le poste $ post = Post :: find (1); if ($ user-> can ('delete', $ post)) echo "L'utilisateur actuellement connecté est autorisé à supprimer le message: $ post-> id";  else echo 'Non autorisé.'; 

Vous pouvez autoriser vos actions de différentes manières à l'aide de stratégies. Dans notre exemple ci-dessus, nous avons utilisé le Utilisateur modèle pour autoriser notre Poster actions modèles.

Le modèle utilisateur fournit deux méthodes utiles à des fins d'autorisation-pouvez et cant. le pouvez La méthode est utilisée pour vérifier si l'utilisateur actuel est capable d'exécuter une action donnée. Et la contrepartie du pouvez méthode, la cant méthode, est utilisé pour déterminer l'incapacité de l'exécution de l'action.

Prenons l'extrait de la vue méthode du contrôleur pour voir ce qu'il fait exactement.

public function view () // récupère l'utilisateur actuellement connecté $ user = Auth :: user (); // charge le poste $ post = Post :: find (1); if ($ user-> can ('view', $ post)) echo "L'utilisateur actuellement connecté est autorisé à mettre à jour le message: $ post-> id";  else echo 'Non autorisé.'; 

Premièrement, nous chargeons l'utilisateur actuellement connecté, ce qui nous donne l'objet du modèle User. Ensuite, nous chargeons un exemple de publication en utilisant le modèle de publication.

Pour aller de l'avant, nous avons utilisé le pouvez méthode du modèle utilisateur pour autoriser la vue action du Poster modèle. Le premier argument de la pouvez méthode est le nom de l'action que vous souhaitez autoriser, et le deuxième argument est l'objet de modèle pour lequel vous souhaitez obtenir une autorisation..

C’était une démonstration de l’utilisation du Utilisateur modèle pour autoriser les actions à l'aide de stratégies. Sinon, vous pouvez utiliser le Assistant contrôleur ainsi, si vous êtes dans le contrôleur tout en autorisant une certaine action.

… $ This-> authorize ('view', $ post);… 

Comme vous pouvez le constater, vous n'avez pas besoin de charger le modèle User si vous utilisez Controller Helper..

C’était donc le concept de règles à votre disposition, et c’est très pratique pour autoriser un modèle ou une ressource, car cela vous permet de regrouper la logique d’autorisation à un seul endroit..

Assurez-vous simplement que vous n'utilisez pas complètement les règles et les règles pour les mêmes actions du modèle, sinon cela créerait des problèmes. Voilà de mon côté pour aujourd'hui, et je l'appellerai un jour!

Conclusion

Aujourd'hui, l'autorisation de Laravel a été au centre de mon article. Au début de l’article, j’ai présenté les principaux éléments de l’autorisation, des barrières et des règles de Laravel..

Ensuite, nous avons créé notre portail personnalisé et notre stratégie pour voir comment cela fonctionne dans le monde réel. J'espère que vous avez apprécié l'article et appris quelque chose d'utile dans le contexte de Laravel.

Pour ceux d'entre vous qui débutent avec Laravel ou qui souhaitent développer leurs connaissances, leur site ou leur application avec des extensions, nous pouvons étudier de nombreuses choses sur le marché Envato..

Comme toujours, j'aimerais avoir de vos nouvelles sous forme de commentaires en utilisant le flux ci-dessous!