如何根據角色為每個使用者定義一組權限的Laravel Spatie權限設定方法?
P粉197639753
P粉197639753 2023-11-14 12:58:58
0
1
837

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

P粉197639753
P粉197639753

全部回覆(1)
P粉736935587

我想您正在使用一種模型,即用戶並將權限直接分配給用戶。這是我的方法所以,您可以做的是,您可以先建立一個角色並為角色授予適當的權限,然後將該角色指派給使用者。

首先,為角色指派權限

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

希望對你有幫助:)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!