如何在Spatie Laravel软件包中扮演多个角色?

时间:2019-12-05 09:06:36

标签: laravel permissions spatie

Spatie的laravel-permission包是否有可能实现Facebook拥有页面权限的功能?

案例研究,

您可以在Facebook上创建一个页面,然后自动成为该页面的 Admin (假设它是角色)。 然后,您可以邀请您的朋友并将他/她设置为发布者角色

之后,您的朋友还可以邀请您进入其信息页,并让您成为编辑者这是您的另一个角色

因此,最后,您将在两个不同的配置文件/页面中扮演两个角色。

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

编辑

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

$user->assignRole('editor');

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

$user->hasRole('writer')

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

就像您在一个页面中具有管理员角色而在另一页面中具有编辑者角色一样。 如果您只检查$user->hasRole('admin')的结果将始终为真。所以我想知道是否有什么我可以做的,还可以检查您要管理哪个页面。

我希望我有道理。

2 个答案:

答案 0 :(得分:0)

。您可以使用artisan创建角色,并在php中进行分配。

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

所有这些都可以在documentation

中轻松获得

答案 1 :(得分:0)

假设您的表结构如下:

页面表格

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

现在在用户模型中添加此方法

#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