Maison > cadre php > Laravel > Comment implémenter l'affichage et le masquage basés sur les autorisations des éléments de page dans Laravel

Comment implémenter l'affichage et le masquage basés sur les autorisations des éléments de page dans Laravel

王林
Libérer: 2023-11-03 08:35:19
original
827 Les gens l'ont consulté

Comment implémenter laffichage et le masquage basés sur les autorisations des éléments de page dans Laravel

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
Copier après la connexion

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
Copier après la connexion

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,
    ],
],
Copier après la connexion

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;

    //...
}
Copier après la connexion

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());
    }
}
Copier après la connexion

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');
    //...
}
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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; ?>";
});
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal