首页  >  问答  >  正文

如何根据角色为每个用户定义一组权限的Laravel Spatie权限设置方法?

我有 4 种类型的用户使用我的系统:1.超级管理员2.超级管理员团队、3.管理员和 4。 管理团队成员, 因为我使用 spatie 来处理角色和权限,所以我有一组对于所有类型的用户来说都很常见的模块(权限),还有其他一组模块(权限)仅适用于超级管理员,例如付款方式等。 现在,一旦为我的数据库播种以获得许可,我是否必须全部播种一次? ['contacts','email','bids'] 带有网络防护(但是我对防护的确切用法及其工作原理有点困惑),因此管理员只能从这些允许的权限中向他的团队分配权限但是,对于超级管理员,我应该使用超级管理员守卫创建其他权限集吗?我想知道什么是最佳实践。 使用案例:超级管理员首先登录系统,然后从列表中决定应授予管理员哪些权限。 2. 管理员登录系统,并将分配哪组权限将授予他的团队,但管理员将无法查看超级管理员拥有的权限列表。 我希望我已经阐明了我的观点,请让我知道实施它的适当方式。

P粉197639753P粉197639753363 天前868

全部回复(1)我来回复

  • P粉736935587

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

    希望对你有帮助:)

    回复
    0
  • 取消回复