【问题标题】:How to make multiple roles in Spatie Laravel package?如何在 Spatie Laravel 包中制作多个角色?
【发布时间】:2020-03-30 04:12:38
【问题描述】:

是否可以使用 Spatie 的 laravel-permission 包来实现类似于 Facebook 的页面权限?

案例研究,

您可以在 Facebook 上创建一个页面,然后您将自动成为该页面的管理员假设它是一个角色)。 然后你可以邀请你的朋友,让他/她成为Publisher角色

之后,您的朋友也可以邀请您加入他们的主页并让您成为编辑器这是您的另一个角色

所以最后你将拥有两个不同的个人资料/页面的两个角色。

我想在我的应用上实现类似的目标。

编辑

我现在知道的是我可以使用:

$user->assignRole('editor');

我可以检查用户是否具有以下角色:

$user->hasRole('writer')

但问题是我如何将该角色与我希望他们管理的页面链接?

例如,如果您在一个页面中具有管理员角色,而在另一页面中具有编辑角色。 如果您只检查$user->hasRole('admin') 是否结果将始终为真。所以我想知道我是否可以做任何事情来分配并检查您管理哪个页面。

我希望我说得通。

【问题讨论】:

  • 到目前为止你做了什么?你能分享一下你有什么吗?
  • 我已经更新了我的问题。

标签: laravel permissions laravel-permission


【解决方案1】:

是的。您可以使用 artisan 创建角色并在 php 中分配它们。

php artisan permission:create-role editor
php artisan permission:create-role publisher
$user->assignRole(['editor', 'publisher']);

所有这些都可以在documentation 中轻松获得

【讨论】:

  • 我觉得你没看懂Q,请再看一遍我已经更新了。
  • 您可以通过在管理员/用户模型和页面模型之间使用 hasMany 关系来实现此目的。一个页面可以有许多用户/管理员。您通过定义每个操作/动作的权限来维护/控制用户可以做什么。然后,您可以将这些权限分配给您创建的角色。
【解决方案2】:

假设您的表结构如下所示:

页表

|---------------------|------------------|------------------|------------------|
|          id         |       name       |   created_at     |   updated_at     |
|---------------------|------------------|------------------|------------------|
|          12         |    PHP masters   |    2019-02-31    |   2019-03-12     |
|---------------------|------------------|------------------|------------------|

页面管理员

|---------------------|------------------|------------------|------------------|
|          id         |      page_id     |      role_id     |     user_id      |
|---------------------|------------------|------------------|------------------|
|          1          |         12       |         2        |        2         |
|---------------------|------------------|------------------|------------------|

角色表

|---------------------|------------------|------------------|------------------|
|          id         |       name       |   created_at     |   updated_at     |
|---------------------|------------------|------------------|------------------|
|          12         |      Editor      |    2019-02-31    |   2019-03-12     |
|---------------------|------------------|------------------|------------------|
|          12         |   System Admin   |    2019-02-31    |   2019-03-12     |
|---------------------|------------------|------------------|------------------|
|          12         |    Page Admin    |    2019-02-31    |   2019-03-12     |
|---------------------|------------------|------------------|------------------|

现在在 User 模型中添加这个方法

#do not forget to import Roles
#use Spatie\Permission\Models\Role;

    public function can_manage($page_id) : bool;
    {

        #Backdoor for the system admin
        if ($this->hasRole(['System Admin'])) {
            return true;
        }


        #now we check if the user has the role for that page
        $role = Role::select('name')
                        ->join("page_admins", 'page_admins.role_id', '=', 'roles.id')
                        ->where("page_id", $page_id)
                        ->where("user_id",   $this->id)
                        ->first();


        #return true if roles was found
        if (!empty($role)) {
            return true;
        }


        #else false
        return false;


    }

最后,如果您想检查用户是否可以访问您使用的页面管理员:

#for jwt-auth
#$user = $request->user(); 

if ( $user->can_manage($page_id) )
{
   #then do you things
}

既然您已经了解了如何检查某人是否在页面管理中,那么您就可以发挥创意了。您可以创建一个方法:

#Get user role in the page
#etc

【讨论】:

  • 终于有人花时间帮忙了。谢谢@chawila
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2020-09-11
  • 2020-07-17
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多