如何根据角色为每个用户定义一组权限的Laravel Spatie权限设置方法?
P粉197639753
P粉197639753 2023-11-14 12:58:58
0
1
914

我有 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;
        });
    }
}

希望对你有帮助:)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板