我有4种类型的用户使用我的系统,1. 超级管理 2,超级管理团队,3. 管理和第4。管理团队成员(),由于我对角色和权限使用空间,我有一组模块(权限),这些模块(权限)对所有类型的用户来说都是常见的,还有其他一些模块(权限),这些模块(权限)仅适用于超级管理(如支付方法等)。现在,一旦将数据库播种为权限,是否必须为所有这些权限播种一次?['contacts','email','bids']
(不过,我对守卫的确切用法和它的工作方式有点困惑),因此管理员只能从这些允许的权限中为其团队分配权限。对于超级管理,是否应该使用超级管理保护创建其他权限集?我想知道什么是最佳实践。用例:Superadmin首先登录到系统,然后决定应该从他的列表中授予管理员哪些权限。2.管理员登录到系统并将哪些权限分配给他的团队,但是管理员将无法看到超级管理员拥有的权限列表。我希望我已经澄清了我的观点,请让我知道适当的执行方法。
发布于 2022-10-24 06:28:18
我想您使用的是一种模型,即用户,并将权限直接分配给用户。下面是我的方法,您可以做的是,首先创建一个角色并给予角色适当的权限,然后将该角色分配给用户。
首先,将权限分配给角色。
$role->syncPermissions(['permission-1', 'permission-2', '...']);
现在,将角色与用户同步。
$user->assignRole('writer');
// Or, you can also assign multiple roles
$user->assignRole('writer', 'admin');
这些是内置的空间中间件,您可以在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;
});
}
}
我希望它能帮到你:)
https://stackoverflow.com/questions/74177014
复制相似问题