Dans Laravel, il est courant d'implémenter l'affichage et le masquage des éléments de page basés sur les autorisations. Cet article expliquera comment utiliser la bibliothèque de gestion des autorisations de Laravel « spatie/laravel-permission » pour implémenter la fonction de rendu dynamique des éléments de page. Dans le même temps, afin de mieux illustrer le problème, cet article écrira un exemple de programme simple.
1. Installez laravel-permission
Tout d'abord, vous devez installer le package de composition "spatie/laravel-permission" dans le projet Laravel. Utilisez la commande suivante pour installer :
composer require spatie/laravel-permission
Une fois l'installation terminée, vous devez exécuter la migration pour créer la table de gestion des autorisations appropriée :
php artisan vendor:publish --provider="SpatiePermissionPermissionServiceProvider" --tag="migrations" php artisan migrate
2. Définir les rôles et les autorisations
Dans cet exemple, nous définirons deux rôles, à savoir « Gestion », « Administrateur » et « Utilisateur ordinaire », et donnez à l'administrateur l'autorisation de visualiser toutes les données.
Tout d'abord, vous devez ajouter la configuration du modèle de rôle et d'autorisation dans le fichier config/auth.php :
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => AppModelsUser::class, ], 'roles' => [ 'driver' => 'eloquent', 'model' => SpatiePermissionModelsRole::class, ], 'permissions' => [ 'driver' => 'eloquent', 'model' => SpatiePermissionModelsPermission::class, ], ],
Ensuite, ajoutez l'association avec les rôles et les autorisations dans le modèle Utilisateur :
namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use SpatiePermissionTraitsHasRoles; class User extends Authenticatable { use HasFactory, HasRoles; //... }
Ensuite, vous pouvez définir le rôle dans Seeder Et autorisations :
use IlluminateDatabaseSeeder; use SpatiePermissionModelsPermission; use SpatiePermissionModelsRole; class RolesAndPermissionsSeeder extends Seeder { public function run() { //创建角色 Role::create(['name' => 'admin']); Role::create(['name' => 'user']); //创建权限 Permission::create(['name' => 'view_all_data']); //管理员拥有所有权限 Role::findByName('admin')->givePermissionTo(Permission::all()); } }
3. Autorisation et authentification
Ensuite, utilisez la méthode authorize() dans le contrôleur pour déterminer si l'utilisateur dispose d'autorisations spécifiques. Par exemple, la méthode d'index suivante nécessite l'autorisation « view_all_data » :
public function index() { $this->authorize('view_all_data'); //... }
De plus, dans la vue, vous pouvez utiliser la méthode can() pour déterminer si l'utilisateur actuel dispose d'une certaine autorisation. Par exemple, dans le code suivant, le bouton « Afficher toutes les données » ne sera affiché que si l'utilisateur dispose de l'autorisation « view_all_data » :
@if(auth()->user()->can('view_all_data')) <button>查看所有数据</button> @endif
Si vous souhaitez un contrôle plus précis, vous pouvez utiliser la méthode role() pour déterminer si l'utilisateur a un certain rôle. Par exemple, dans le code suivant, le « Menu Administrateur » s'affichera uniquement lorsque l'utilisateur a le rôle « admin » :
@if(auth()->user()->hasRole('admin')) <menu>管理员菜单</menu> @endif
4. Rendu dynamique des éléments de la page
Parfois, certains éléments de la page doivent être basés sur les rôles ou les autorisations de l'utilisateur actuel pour un rendu dynamique. Par exemple, vous pouvez définir que seuls les administrateurs peuvent voir le bouton "Supprimer" :
@if(auth()->user()->can('delete_data')) <button>删除</button> @endif
Cependant, s'il y a plusieurs éléments qui doivent être rendus dynamiquement en fonction des autorisations, alors chaque élément doit être jugé individuellement, ce qui conduira au code duplication et augmentation des coûts de maintenance. À ce stade, vous pouvez encapsuler cette fonction dans une commande Blade et la laisser accepter un nom d'autorisation comme paramètre :
Blade::directive('can', function ($expression) { return "<?php if(auth()->user()->can({$expression})): ?>"; }); Blade::directive('endcan', function () { return "<?php endif; ?>"; });
En utilisant cette commande, vous pouvez restituer dynamiquement les éléments de la page de la manière suivante :
@can('delete_data') <button>删除</button> @endcan
De cette façon, le le code devient plus concis et clair.
Résumé
En utilisant la bibliothèque de gestion des autorisations de Laravel "spatie/laravel-permission", nous pouvons facilement implémenter l'affichage et le masquage des éléments de la page basés sur les autorisations. Dans le même temps, l'encapsulation du code rendu dynamiquement dans les instructions Blade peut simplifier davantage le code et améliorer la lisibilité et la maintenabilité du code.
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!