Как сделать несколько ролей в пакете Spatie Laravel?

С пакетом Spatie laravel-permission можно добиться чего-то вроде того, что есть у Facebook с их разрешениями для страниц. ?

Тематическое исследование,

На Facebook вы можете создать страницу, после чего вы автоматически станете администратором (при условии, что это роль) этой страницы. Затем вы можете пригласить друга и назначить ему/ей роль Издателя.

После этого ваш друг также может пригласить вас на свою Страницу и сделать вас редактором ( это еще одна ваша роль)

так что в конце у вас будет две роли для двух разных профилей/страниц.

Я хочу добиться чего-то подобного в своем приложении.

РЕДАКТИРОВАТЬ

что я знаю на данный момент, так это то, что я могу использовать:

$user->assignRole('editor');

и я могу проверить, есть ли у пользователя роли:

$user->hasRole('writer')

Но дело в том, как связать эту роль со страницей, которой я хочу, чтобы они управляли?

Например, если у вас есть роль администратора на одной странице и роль редактора на другой странице. и если вы просто проверите, $user->hasRole('admin') ли результаты всегда будут истинными. поэтому я хочу знать, могу ли я что-нибудь сделать, чтобы назначить, а также проверить, для какой страницы вы являетесь администратором.

Я надеюсь, что я имею смысл.


person ThaCoder    schedule 05.12.2019    source источник
comment
Что вы сделали до сих пор? Можете ли вы поделиться тем, что у вас есть?   -  person petersowah    schedule 05.12.2019
comment
я обновил свой вопрос.   -  person ThaCoder    schedule 05.12.2019


Ответы (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     |
|---------------------|------------------|------------------|------------------|

Теперь внутри модели пользователя добавьте этот метод

#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
person chawila    schedule 10.12.2019
comment
Наконец кто-то нашел время, чтобы помочь. спасибо @chawila - person ThaCoder; 10.12.2019

Да. Вы можете создать роли с помощью artisan и назначить их в php.

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

все это легко доступно в документации

person blues    schedule 05.12.2019
comment
Я думаю, вы не поняли Вопрос, пожалуйста, прочитайте еще раз, я обновил его. - person ThaCoder; 05.12.2019
comment
Вы можете добиться этого, используя отношение hasMany между вашей моделью Admin/User и моделью Page. На странице может быть много пользователей/админов. Вы поддерживаете/контролируете, что может делать пользователь, определяя разрешения для каждой операции/действия. Затем вы можете назначить эти разрешения созданным вами ролям. - person petersowah; 05.12.2019