首頁  >  問答  >  主體

如何根據角色為每個使用者定義一組權限的Laravel Spatie權限設定方法?

我有4 種類型的使用者使用我的系統:1.超級管理員2.超級管理員團隊、3.管理員和4。 管理團隊成員, 因為我使用spatie 來處理角色和權限,所以我有一組對於所有類型的用戶來說都很常見的模組(權限),還有其他一組模組(權限)僅適用於超級管理員,例如付款方式等。 現在,一旦為我的資料庫播種以獲得許可,我是否必須全部播種一次? ['contacts','email','bids'] 帶有網路防護(但是我對防護的確切用法及其工作原理有點困惑),因此管理員只能從這些允許的權限中向他的團隊分配權限但是,對於超級管理員,我應該使用超級管理員守衛建立其他權限集嗎?我想知道什麼是最佳實踐。 使用案例:超級管理員先登入系統,然後從清單中決定應授予管理員哪些權限。 2. 管理員登入系統,並將分配哪一組權限將授予他的團隊,但管理員將無法查看超級管理員擁有的權限清單。 我希望我已經闡明了我的觀點,請讓我知道實施它的適當方式。

P粉197639753P粉197639753314 天前811

全部回覆(1)我來回復

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

    希望對你有幫助:)

    回覆
    0
  • 取消回覆