Les Policy

Voir la vidéo
Description Sommaire

Dans ce nouveau chapitre, nous allons replonger sur la partie sécurisation et on va voir le système d'autorisation de Laravel. Jusqu'à maintenant nous avons simplement utilisé le système de middleware mais il est possible d'utiliser des classes qui vont permettre de définir les permissions action par action.

La création d'une politique d'accès va souvent se faire en lien avec un model.

php artisan make:policy PostPolicy --model=Post

Ensuite, à l'intérieur du fichier PostPolicy les fonctions devront retourner false ou true en fonction de si on autorise ou non l'accès à la ressource. Il faudra ensuite enregistrer le lien entre le modèle et la politique en modifiant la propriété $policies dans le AuthServiceProvider.

<?php

namespace App\Providers;

use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{

    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    public function boot(): void
    {
        // ...
    }
}

Vérifier la permission

Maintenant que nos politiques sont créées on peut les utiliser pour vérifier si l'utilisateur a accès ou non à une ressource. Cela peut se faire de différentes manières.

Model User

Le model User fournit par défaut dispose de méthodes permettant de vérifier l'accès de l'utilisateur.

$user->can('update', $post); // true / false
$user->cannot('update', $post); // true /false

Controller

Si votre Controller hérite du App\Http\Controllers\Controller vous aurez accès à la méthode authorize qui vous permettra de voir si l'utilisateur a le droit de faire l'action demandée.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Update the given blog post.
     *
     * @throws \Illuminate\Auth\Access\AuthorizationException
     */
    public function update(Request $request, Post $post): RedirectResponse
    {
        $this->authorize('update', $post);
        return redirect('/posts');
    }
}

Cette méthode renverra une exception si l'utilisateur n'a pas les permissions nécessaire et le framework la capturera pour agir en fonction (redirection ou affichage d'une réponse JSON).

Middlewares

Laravel offre aussi un middleware spécial can qui permet de vérifier la permission depuis la déclération de la route.

use App\Models\Post;

Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->middleware('can:update,post');

Blade

Dans les vue blade si vous voulez afficher ou masquer un bouton en fonction des permissions de l'utilisateur vous pouvez utiliser la directive @can ou @cannot.

@can('update', $post)
    <!-- L'utilisateur peut modifier l'article... -->
@elsecan('create', App\Models\Post::class)
    <!-- L'utilisateur peut créer un article... -->
@else
    <!-- ... -->
@endcan

@cannot('update', $post)
    <!-- L'utilisateur ne peut pas modifier l'article... -->
@elsecannot('create', App\Models\Post::class)
    <!-- ... -->
@endcannot
Publié
Technologies utilisées
Auteur :
Grafikart
Partager