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