如何在 Spatie Laravel 包中制作多个角色?

How to make multiple roles in Spatie Laravel package?

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

案例研究,

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

之后,您的朋友还可以邀请您访问他们的主页,让您成为编辑这是您的另一个角色

所以最后你将有两个不同的角色 profiles/Pages。

我想在我的应用程序上实现类似的功能。

编辑

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

$user->assignRole('editor');

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

$user->hasRole('writer')

但问题是我如何 link 我希望他们管理的页面角色?

就像您在一个页面中具有管理员角色而在另一页面中具有编辑角色一样。 如果你只是检查 $user->hasRole('admin') 是否结果总是正确的。所以我想知道是否有任何我可以分配的东西,并检查你是哪个页面的管理员。

希望我说的有道理。

。您可以使用 artisan 创建角色并在 php.

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

所有这些都可以在 documentation

中轻松获得

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

页数table

|---------------------|------------------|------------------|------------------|
|          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         |
|---------------------|------------------|------------------|------------------|

角色 table

|---------------------|------------------|------------------|------------------|
|          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     |
|---------------------|------------------|------------------|------------------|

现在在用户模型中添加这个方法

#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