我有 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; }); } }
希望对你有帮助:)