Maison  >  Questions et réponses  >  le corps du texte

Comment définir la méthode de définition des autorisations Laravel Spatie pour définir un ensemble d'autorisations pour chaque utilisateur en fonction du rôle ?

J'ai 4 types d'utilisateurs qui utilisent mon système : 1. Super Admin 2. Super Admin Team , 3. Administrateur et 4. Membres de l'équipe de direction, Parce que j'utilise spatie pour gérer les rôles et les autorisations, j'ai un ensemble de modules (autorisations) communs à tous les types d'utilisateurs, et un autre ensemble de modules (autorisations) réservés aux super-administrateurs, comme les méthodes de paiement, etc. Maintenant, une fois que ma base de données est amorcée pour autorisation, dois-je tout amorcer en même temps ? ['contacts','email','bids'] Livré avec Network Guard (mais je suis un peu confus quant à l'utilisation exacte de guard et à son fonctionnement), donc l'administrateur ne peut attribuer des autorisations à son équipe qu'à partir de ces autorisations autorisées. Cependant, pour Super Admin, je devrais utiliser Super Admin Garde Créer d'autres ensembles d'autorisations ? Je veux savoir quelle est la meilleure pratique. Cas d'utilisation : Super administrateurConnectez-vous d'abord au système, puis décidez dans la liste quelles autorisations doivent être accordées à l'administrateur. 2. L'administrateur se connecte au système et attribue l'ensemble d'autorisations qui sera accordé à son équipe, mais l'administrateur ne pourra pas afficher la liste des autorisations dont dispose le super administrateur. J'espère avoir été clair sur mon point de vue, veuillez me faire savoir la manière appropriée de le mettre en œuvre.

P粉197639753P粉197639753363 Il y a quelques jours872

répondre à tous(1)je répondrai

  • P粉736935587

    P粉7369355872023-11-15 10:44:18

    Je suppose que vous utilisez un modèle qui est celui des utilisateurs et que vous attribuez des autorisations directement aux utilisateurs. Voici mon approche. Donc, ce que vous pouvez faire, c'est d'abord créer un rôle et accorder les autorisations appropriées au rôle, puis attribuer le rôle à l'utilisateur.

    Tout d'abord, attribuez des autorisations au rôle

    $role->syncPermissions(['permission-1', 'permission-2', '...']);

    Maintenant, synchronisez les rôles avec les utilisateurs

    $user->assignRole('writer');
    
    // Or, you can also assign multiple roles
    $user->assignRole('writer', 'admin');

    Ce sont des middlewares spatie intégrés que vous pouvez écrire dans app/Http/Kernel.php

    protected $routeMiddleware = [
        // ...
        'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
        'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
        'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
    ];

    Vous pouvez désormais utiliser un middleware « rôle » dans les routes à protéger,

    // for superadmin
    Route::group(['middleware' => ['role:superadmin']], function () {
        //
    });
    
    // for admin
    Route::group(['middleware' => ['role:admin']], function () {
        //
    });
    
    // Or with multiple roles
    Route::group(['middleware' => ['role:superadmin|admin']], function () 
    {
        //
    });
    
    ...

    Donc, vous devez maintenant obtenir des autorisations pour un rôle spécifique, c'est-à-dire Super Administrateur ou Administrateur. Voici ce que vous pouvez faire,

    // get all permissions associated with a role
    $role->permissions;
    
    // get specific columns of permissions
    $role->permissions->pluck('name');

    Vous pouvez également obtenir des rôles d'utilisateur de cette façon

    auth()->user()->roles;
    
    // Or get only role names
    auth()->user()->getRoleNames();
    
    // Or check if user has a specific role
    auth()->user()->hasRole('admin')

    Encore une chose, pour le super administrateur, vous n'avez pas besoin d'obtenir les autorisations du rôle, vous pouvez obtenir toutes les autorisations directement. Et comme le super-administrateur a accès à l'ensemble du système, vous pouvez contourner la vérification des autorisations du super-administrateur en procédant ainsi :

    use Illuminate\Support\Facades\Gate;
    
    class AuthServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            $this->registerPolicies();
    
            // Implicitly grant "Super Admin" role all permissions
            // This works in the app by using gate-related functions like 
            // auth()->user->can() and @can()
            Gate::before(function ($user, $ability) {
                return $user->hasRole('superadmin') ? true : null;
            });
        }
    }

    J'espère que cela vous aidera :)

    répondre
    0
  • Annulerrépondre