Пользователи Laravel с различными наборами разрешений в зависимости от арендатора - PullRequest
0 голосов
/ 09 апреля 2019

В настоящее время я работаю над проектом Laravel, который несколько мультитенантен. Администратор будет создавать компании, которые по сути являются арендаторами, но пользователь может входить в состав нескольких компаний, каждая из которых имеет роль или назначенные индивидуальные разрешения.

Чтобы сделать вещи более сложными, пользователь также может быть назначен на проект с ролью, которая предоставит ему доступ к этому проекту, даже если он не является частью этого проекта.

Пользователь сможет видеть все свои данные, к которым он привязан, на одном портале, поэтому нет переключающихся арендаторов.

Так что разрешения становятся ужасно запутанными со всеми отношениями. Ниже приведены таблицы, которые, как я предполагаю, необходимы для установки таких отношений:

Пользователь:

  • ID

user_role (используется для назначения пользователей-администраторов):

  • user_id
  • role_id

Компания:

  • ID

user_company:

  • ID
  • user_id
  • company_id
  • role_id

user_company_permission:

  • ID
  • user_company_id
  • permission_id

разрешение:

  • ID
  • имя

Роль:

  • ID
  • имя

permission_role:

  • ID
  • permission_id
  • role_id

проект: - Я бы - (другая информация, связанная с проектом)

project_user: - Я бы - project_id - Идентификатор пользователя - role_id

Итак, есть ли простой способ управления всеми этими разрешениями? Было бы неплохо, если бы при проверке разрешений по умолчанию проверялись все компании и проекты пользователя, но если они были переданы, это ограничивало бы эту компанию или проект.

Я просмотрел некоторые плагины разрешений, но не могу найти ничего, что могло бы легко удовлетворить мою проблему.

1 Ответ

0 голосов
/ 09 апреля 2019

Если разрешения каждой роли не должны быть динамическими, вы можете заменить таблицы role и permission на Политики.Просто добавьте поле role в таблицу user_company (я бы лично сделал строку удобной для чтения).

Затем в CompanyPolicy вы можете запускать проверки следующим образом:


    /**
     * Determine whether the user can view the object.
     *
     * @param  \App\User  $user
     * @param  \App\Company  $company
     * @return mixed
     */
    public function view(User $user, Company $company)
    {
        $allowedRoles = ['admin', 'someotherrole'];
        return $user->companies()->wherePivotIn('role', $allowedRoles)->count() > 0;
    }

Если позже вам понадобятся динамические разрешения, вы все равно можете добавить их в дополнение к этому методу и проверить отдельные разрешения перед проверкой роли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...