Recherche…


Introduction

Laravel fournit un moyen simple d'autoriser les actions des utilisateurs sur des ressources spécifiques. Avec l'autorisation, vous pouvez autoriser de manière sélective les utilisateurs à accéder à certaines ressources tout en refusant l'accès aux autres. Laravel fournit une API simple pour gérer les autorisations utilisateur à l'aide de Gates et de Policies . Gates AuthServiceProvider approche simple de l'autorisation basée sur la fermeture à l'aide de AuthServiceProvider tandis que les Policies vous permettent d'organiser la logique d'autorisation autour des modèles utilisant des classes.

Utiliser les portes

Gates sont des fermetures qui déterminent si un utilisateur est autorisé à effectuer une certaine action sur une ressource. Gates sont généralement définies dans la méthode d'amorçage d' AuthServiceProvider et nommées de manière succincte pour refléter ce qu'elles font. Voici un exemple de portail permettant uniquement aux utilisateurs premium de visualiser certains contenus:

Gate::define('view-content', function ($user, $content){
    return $user->isSubscribedTo($content->id);
});

Une Gate reçoit toujours une instance d'utilisateur en tant que premier argument, vous n'avez pas besoin de la passer lors de l'utilisation de la porte, et peut éventuellement recevoir des arguments supplémentaires tels que le modèle éloquent concerné.

Autoriser des actions avec des portes

Pour utiliser l'exemple ci-dessus sur un modèle de lame afin de masquer le contenu de l'utilisateur, vous devez généralement procéder comme suit:

@can('view-content', $content)
 <! -- content here -->
@endcan

Pour empêcher complètement la navigation vers le contenu, vous pouvez effectuer les opérations suivantes dans votre contrôleur:

if(Gate::allows('view-content', $content)){
    /* user can view the content */
}

        OR

if(Gate::denies('view-content', $content)){
    /* user cannot view content */
}

Remarque: vous n'êtes pas obligé de transférer l'utilisateur actuellement authentifié à cette méthode, Laravel s'en charge pour vous.

Les politiques

Les stratégies sont des classes qui vous aident à organiser la logique d'autorisation autour d'une ressource de modèle. En utilisant notre exemple précédent, nous pourrions avoir un ContentPolicy qui gère l'accès des utilisateurs au modèle de Content .

Pour rendre ContentPolicy , laravel fournit une commande artisanale. Il suffit de courir

php artisan make:policy ContentPolicy

Cela fera une classe de politique vide et placera dans le dossier app/Policies . Si le dossier n'existe pas, Laravel le créera et placera la classe à l'intérieur.

Une fois créées, les stratégies doivent être enregistrées pour aider Laravel à savoir quelles politiques utiliser lors de l’autorisation d’actions sur des modèles. AuthServiceProvider de Laravel, fourni avec toutes les nouvelles installations Laravel, possède une propriété AuthServiceProvider qui AuthServiceProvider vos modèles éloquents à leurs règles d'autorisation. Tout ce que vous devez faire ajoute le mappage au tableau.

protected $policies = [
    Content::class => ContentPolicy::class,
 ];

Politiques d'écriture

L'écriture de Policies suit le même schéma que l'écriture de Gates . La porte d'autorisation de contenu peut être réécrite sous la forme d'une politique comme celle-ci:

function view($user, $content)
{
    return $user->isSubscribedTo($content->id);
}

Les stratégies peuvent contenir plus de méthodes que nécessaire pour prendre en charge tous les cas d'autorisation d'un modèle.

Autoriser des actions avec des stratégies

Via le modèle de l'utilisateur

Le modèle Laravel User contient deux méthodes d'aide aux autorisations à l'aide de Policies ; can et can't . Ces deux peuvent être utilisés pour déterminer si un utilisateur a une autorisation ou non sur un modèle respectivement.

Pour vérifier si un utilisateur peut afficher un contenu ou non, vous pouvez effectuer les opérations suivantes:

if($user->can('view', $content)){
    /* user can view content */
}

        OR

if($user->cant('view', $content)){
    /* user cannot view content */
}

Via Middleware

Route::get('/contents/{id}, function(Content $content){
    /* user can view content */
})->middleware('can:view,content');

Via les contrôleurs

Laravel fournit une méthode d'assistance, appelée authorize qui prend le nom de la stratégie et le modèle associé comme arguments et autorise l'action en fonction de votre logique d'autorisation ou refuse l'action et lance une exception AuthorizationException que le gestionnaire Laravel Exception convertit en 403 HTTP response .

pubic function show($id)
{
    $content = Content::find($id);

    $this->authorize('view', $content);
        
    /* user can view content */
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow