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