首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel空间权限如何根据角色为每个用户定义权限集?

Laravel空间权限如何根据角色为每个用户定义权限集?
EN

Stack Overflow用户
提问于 2022-10-24 05:40:51
回答 1查看 110关注 0票数 1

我有4种类型的用户使用我的系统,1. 超级管理 2,超级管理团队,3. 管理和第4。管理团队成员(),由于我对角色和权限使用空间,我有一组模块(权限),这些模块(权限)对所有类型的用户来说都是常见的,还有其他一些模块(权限),这些模块(权限)仅适用于超级管理(如支付方法等)。现在,一旦将数据库播种为权限,是否必须为所有这些权限播种一次?['contacts','email','bids'] (不过,我对守卫的确切用法和它的工作方式有点困惑),因此管理员只能从这些允许的权限中为其团队分配权限。对于超级管理,是否应该使用超级管理保护创建其他权限集?我想知道什么是最佳实践。用例:Superadmin首先登录到系统,然后决定应该从他的列表中授予管理员哪些权限。2.管理员登录到系统并将哪些权限分配给他的团队,但是管理员将无法看到超级管理员拥有的权限列表。我希望我已经澄清了我的观点,请让我知道适当的执行方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 06:28:18

我想您使用的是一种模型,即用户,并将权限直接分配给用户。下面是我的方法,您可以做的是,首先创建一个角色并给予角色适当的权限,然后将该角色分配给用户。

首先,将权限分配给角色。

代码语言:javascript
运行
复制
$role->syncPermissions(['permission-1', 'permission-2', '...']);

现在,将角色与用户同步。

代码语言:javascript
运行
复制
$user->assignRole('writer');

// Or, you can also assign multiple roles
$user->assignRole('writer', 'admin');

这些是内置的空间中间件,您可以在app/Http/Kernel.php中编写。

代码语言:javascript
运行
复制
protected $routeMiddleware = [
    // ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];

现在,您可以在路由中使用“角色”中间件来进行保护,

代码语言:javascript
运行
复制
// 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 () 
{
    //
});

...

因此,现在您需要获得特定角色的权限,即超级管理或管理。这是你能做的

代码语言:javascript
运行
复制
// get all permissions associated with a role
$role->permissions;

// get specific columns of permissions
$role->permissions->pluck('name');

此外,您还可以以这种方式获得用户角色。

代码语言:javascript
运行
复制
auth()->user()->roles;

// Or get only role names
auth()->user()->getRoleNames();

// Or check if user has a specific role
auth()->user()->hasRole('admin')

还有一件事,,对于超级管理员来说,您不需要从可以直接获得所有权限的角色获得权限。因为超级管理员可以访问整个系统,所以您可以通过这样做绕过对超级管理员的权限检查,

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74177014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档