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