Maison  >  Article  >  cadre php  >  Parlons des intercepteurs (Gates) dans Laravel

Parlons des intercepteurs (Gates) dans Laravel

青灯夜游
青灯夜游avant
2022-09-28 19:59:341612parcourir

Parlons des intercepteurs (Gates) dans Laravel

Laravel Gates (intercepteurs) vous permettent d'autoriser les utilisateurs à accéder à certaines zones de votre application. Vous pouvez facilement définir des intercepteurs dans votre application, puis les utiliser pour autoriser ou refuser l'accès.

Exemple simple

Supposons que dans la table des utilisateurs, il y ait une colonne nommée admin, selon que l'utilisateur est un administrateur, elle peut être 1 ou 0. Nous pouvons facilement sécuriser un module de notre application avec une simple vérification comme celle-ci : admin 的列,根据用户是否是管理员,它可以是 10。我们可以通过如下简单的检查来轻松保护应用程序的一部分模块:

Route::get('administration', function(){
    if(auth()->check() && auth()->user()->admin){
        echo 'Welcome to the admin section';
    } else {
        echo 'You shall not pass';
    }
});

如果特定用户的 admin 行设置为 1 ,他们将看到以下输出。

Admin access screenshot

否则,他们将看到以下内容:

Admin denied access

这看上去很棒对吧!我们有一种简单的方法来允许或拒绝访问我们应用程序中的特定部分。然而问题是:如果整个应用程序中,有大量的位置要检查并修改用户访问权限怎么办。我们将不得不全局搜索代码并在每个地方修改这个逻辑。效率不是很高。

对此,我们可以定义一个 Gate(拦截器)并在整个应用程序中使用它。

定义拦截器

要定义拦截器,可以打开 AppProvidersAuthServiceProvider.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';
    }
});

请注意: Gate::denies() 方法会对 Gate::allows() 执行反向检查

拦截器的好处是我们现在可以随时更改我们的定义,授权逻辑会同步在整个应用程序中更改。

使用拦截器的另一个目的是检查与数据相关的权限。以博客为例,我们可以授予用户对他们创建的帖子的编辑权限。

我们可以将数据传递给拦截器以检查用户是否有权执行某项操作。

像拦截器传递数据

假设我们的应用程序有一个 Post 表,其中有一列 user_id,其中包含创建它的用户的 ID。我们可以定义一个 Gate(拦截器)来确定用户是否可以像这样编辑特定的帖子:

Gate::define('edit-post', function ($user, $post) {
    return $user->id === $post->user_id;
});

两个参数被传递给我们的拦截器定义。第一个是 $user 对象,其中包含经过身份验证的用户,第二个参数是我们的 $post 对象。

小Tips:如果没有经过身份验证的用户,拦截器将返回 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 函数。

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);

    }
}

如果控制器从 AppHttpControllersController 基类继承而来,你可以像使用 Gate::allow() 函数一样使用 authorize() 助手函数。

最后,如果我们想在视图中检查授权怎么办?我们可以使用 @can Blade 函数助手来做到这一点。

在视图层进行鉴权

假设 Blade 视图如下:

nbsp;html>


    <meta>
    <meta>
    <title>{{ $post->title }}</title>


    <h1>{{ $post->title }}</h1>
    <p>{!! $post->body !!}</p>

我们可以使用 Blade 助手函数 @can 检查当前用户是否被允许编辑这篇文章:

nbsp;html>


    <meta>
    <meta>
    <title>{{ $post->title }}</title>


    <h1>{{ $post->title }}</h1>
    <p>{!! $post->body !!}</p>

    @can('edit-post', $post)
        id }}">Edit Post
    @endcan


如果经过身份验证的用户是该帖子的原始作者,他们将看到一个编辑帖子按钮。

使用 @can  助手函数可以使我们的代码更易于阅读和管理。你也可以使用 @cannotrrreee

Si un utilisateur spécifique a sa ligne admin définie sur 1 , il verra ce qui suit sortir.

Capture d'écran de l'accès administrateur

Sinon, ils verront Le contenu suivant :

Accès refusé par l'administrateur

Cela ressemble à Super, non ? Nous disposons d'un moyen simple d'autoriser ou de refuser l'accès à des parties spécifiques de notre application. Cependant, le problème est le suivant : que se passe-t-il s'il existe un grand nombre d'endroits dans l'application où les autorisations d'accès des utilisateurs doivent être vérifiées et modifiées. Il faudrait chercher le code globalement et modifier cette logique partout. Pas très efficace. 🎜🎜Pour cela, nous pouvons définir un Gate (intercepteur) et l'utiliser tout au long de l'application. 🎜🎜🎜Définir les intercepteurs🎜🎜🎜Pour définir les intercepteurs, vous pouvez ouvrir le fichier AppProvidersAuthServiceProvider.php et ajouter le contenu suivant dans notre méthode boot() : 🎜rrreee🎜 Nous peut utiliser cet intercepteur n'importe où dans l'application où nous souhaitons authentifier l'utilisateur administrateur. Dans la section suivante, vous verrez comment nous utilisons ce nouvel intercepteur. 🎜🎜🎜Utiliser des intercepteurs🎜🎜🎜Pour utiliser des intercepteurs, nous pouvons appeler la méthode Gate::allows() ou Gate::denies() comme suit : 🎜rrreee🎜Veuillez noter : La méthode Gate::denies() effectuera une vérification inversée sur Gate::allows() 🎜🎜Interceptor L'avantage est que nous pouvons désormais modifier notre définition à tout moment et que la logique d'autorisation sera modifiée de manière synchrone dans toute l'application. 🎜🎜Un autre objectif de l'utilisation des intercepteurs est de vérifier les autorisations liées aux données. En prenant un blog comme exemple, nous pouvons accorder aux utilisateurs des autorisations de modification sur les articles qu'ils créent. 🎜🎜Nous pouvons transmettre des données à l'intercepteur pour vérifier si l'utilisateur est autorisé à effectuer une action. 🎜🎜🎜Transmission de données comme des intercepteurs🎜🎜🎜Supposons que notre application ait une table 🎜Post🎜 avec une colonne user_id contenant le 🎜ID🎜 de l'utilisateur qui l'a créé. Nous pouvons définir un Gate (intercepteur) pour déterminer si un utilisateur peut modifier une publication spécifique comme ceci : 🎜rrreee🎜 Deux paramètres sont transmis à notre définition d'intercepteur. Le premier est l'objet $user, qui contient l'utilisateur authentifié, et le deuxième paramètre est notre objet $post. 🎜
🎜Conseils : S'il n'y a pas d'utilisateur authentifié, l'intercepteur retournera false. 🎜
🎜L'intercepteur autorisera l'accès si l'utilisateur authentifié est l'auteur original, sinon il refusera l'accès. 🎜🎜Voici un exemple rapide de la façon dont nous pouvons utiliser le nouvel intercepteur edit-post. 🎜rrreee🎜Ci-dessus, nous avons utilisé Route Closures dans l'exemple, mais nous souhaiterons peut-être mapper cette route à un contrôleur. Cela nous permettra également d'utiliser la nouvelle fonction 🎜Authorize🎜. 🎜🎜🎜Fonction d'assistance d'autorisation d'autorisation 🎜🎜🎜Outre l'efficacité, une autre raison d'utiliser des intercepteurs est la fonction d'assistance. 🎜🎜Supposons que nous mappons l'itinéraire vers le contrôleur : 🎜rrreee🎜 Nous pouvons utiliser l'assistant authorize() pour vérifier si l'utilisateur authentifié a la permission de modifier la publication : 🎜rrreee🎜Si le contrôleur démarre à partir de Hérité de la classe de base AppHttpControllersController, vous pouvez utiliser la fonction d'assistance authorize() tout comme la fonction Gate::allow(). 🎜🎜Enfin, que se passe-t-il si nous voulons vérifier l'autorisation dans la vue ? Nous pouvons le faire en utilisant l'assistant de fonction @can Blade. 🎜🎜🎜Authentification au niveau de la couche de vue🎜🎜🎜Supposons que la vue Blade soit la suivante : 🎜rrreee🎜Nous pouvons utiliser la fonction d'assistance Blade @can pour vérifier si l'utilisateur actuel est autorisé à modifier cet article : 🎜rrreee🎜Si les utilisateurs authentifiés qui sont les auteurs originaux de la publication verront un bouton 🎜Modifier la publication🎜. 🎜🎜L'utilisation de la fonction d'assistance @can peut rendre notre code plus facile à lire et à gérer. Vous pouvez également utiliser @cannot pour faire le contraire. 🎜🎜🎜Résumé🎜🎜🎜Voici les bases de l'utilisation des Gates (intercepteurs) dans les applications Laravel. Les intercepteurs nous permettent d'autoriser facilement des utilisateurs spécifiques à accéder à des zones de notre application. Cela peut également être appelé une 🎜Access Control List🎜 (ACL), une liste d'autorisations associées à un objet. 🎜

Mais il ne faut pas trop compliquer les choses... Dans le scénario le plus simple, les Intercepteurs sont utilisés pour autoriser ou refuser l'accès. Les utilisateurs peuvent soit se voir accorder une autorisation, soit se voir refuser cette autorisation.

Puisque ce tutoriel a pour but de faire passer l'utilisateur et non pas... il est logique de vous envoyer cette image de Gandalf du Seigneur des Anneaux (tête de chien manuelle).

Parlons des intercepteurs (Gates) dans Laravel

Pour en savoir plus sur les Laravel Gates (intercepteurs), assurez-vous de visiter la documentation d'autorisation de Laravel.

Adresse originale en anglais : https://devdojo.com/tnylea/laravel-gates

Adresse de traduction : https://learnku.com/laravel/t/67585

[Recommandations associées : tutoriel vidéo laravel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer