Heim  >  Fragen und Antworten  >  Hauptteil

Wie stelle ich die Berechtigungseinstellungsmethode von Laravel Spatie ein, um einen Satz von Berechtigungen für jeden Benutzer basierend auf der Rolle zu definieren?

Ich habe 4 Arten von Benutzern, die mein System verwenden: 1.Super Admins 2.Super Admin Team, 3.Admins und 4. Mitglieder des Managementteams, Da ich Spatie verwende, um Rollen und Berechtigungen zu verwalten, verfüge ich über eine Reihe von Modulen (Berechtigungen), die allen Benutzertypen gemeinsam sind, und eine weitere Reihe von Modulen (Berechtigungen), die nur für Superadministratoren gelten, z. B. Zahlungsmethoden usw. . Sobald meine Datenbank für die Berechtigung geseed ist, muss ich dann alles auf einmal säen? ['contacts','email','bids'] Kommt mit Network Guard (aber ich bin etwas verwirrt über die genaue Verwendung von Guard und wie es funktioniert), sodass der Administrator seinem Team nur Berechtigungen aus diesen zulässigen Berechtigungen zuweisen kann. Für Super Admin sollte ich jedoch Super Admin verwenden Guard Zusätzliche Berechtigungssätze erstellen? Ich möchte wissen, was die beste Vorgehensweise ist. Anwendungsfall: SuperadministratorMelden Sie sich zunächst am System an und entscheiden Sie dann anhand der Liste, welche Berechtigungen dem Administrator gewährt werden sollen. 2. Der Administrator meldet sich beim System an und weist zu, welche Berechtigungen seinem Team gewährt werden. Der Administrator kann jedoch die Liste der Berechtigungen des Superadministrators nicht anzeigen. Ich hoffe, ich habe meinen Standpunkt klar zum Ausdruck gebracht. Bitte teilen Sie mir mit, wie ich ihn am besten umsetzen kann.

P粉197639753P粉197639753363 Tage vor869

Antworte allen(1)Ich werde antworten

  • P粉736935587

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

    我想您正在使用一种模型,即用户并将权限直接分配给用户。这是我的方法所以,您可以做的是,您可以首先创建一个角色并为角色授予适当的权限,然后将该角色分配给用户。

    首先,为角色分配权限

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

    现在,将角色与用户同步

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

    这些是内置的 spatie 中间件,您可以在 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,
    ];

    现在,您可以在路由中使用“角色”中间件来保护,

    // 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 () 
    {
        //
    });
    
    ...

    所以,现在您需要获得特定角色的权限,即超级管理员或管理员。这是你可以做的,

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

    此外,您还可以通过这种方式获取用户角色

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

    还有一件事,对于超级管理员,您不需要从角色获得权限,您可以直接获得所有权限。而且由于超级管理员可以访问整个系统,因此您可以通过这样做绕过超级管理员的权限检查,

    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;
            });
        }
    }

    希望对你有帮助:)

    Antwort
    0
  • StornierenAntwort