Laravel Spatie / Permission filter для мультитенанта - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть 3 основные модели:

  • Пользователи
  • Филиалы
  • Объекты

Каждый пользователь будет принадлежать к Branch и Branch будет иметь множество Users.

Objects будет принадлежать Users и Branch, так что Objects имеет user_id и branch_id вот так:

//Objects DB table tructure
[
 "id",
 "name",
 "branch_id",
 "user_id",
 "created_at",
 "updated_at",
]

Так вот мои текущие настройки:

Models / Branch.php

public function users()
{
    return $this->hasMany(User::class);
}

Models / Users.php

public function branch()
{
    return $this->belongsTo(Branch::class);
}

Models / Objects.php

public function user()
{
    return $this->belongsTo(User::class);
}

Теперь я настроил Пространство / Разрешение со следующими Roles:

  • Super-Admin: будет видеть каждый Objects каждого Branch
  • Admin: будет видеть каждый Objects своегоBranch, а не от других Branches
  • User: будет видеть каждый Objects, которого он создал, не создавая ничего другого в своем Branch или вне его

Моя цель сейчас состоит в том, чтобы перечислить все Objects на основе разрешения пользователя.Моя первая идея - построить отношения на основе моделей, но я не уверен, что это хорошая идея и практика, это код:

public function objects(){

    $user = auth()->user();

    if ($user->hasRole("Super-Admin")) {
        return Object::query();
    }

    if ($user->hasRole("Admin")) {
        return Object::where('branch_id', '=', $user->branch()->pluck('id'));
    }

    return $this->hasMany(Object::class);

}

Имеет ли это смысл вообще?Должен ли я использовать другие более подходящие функции / API Laravel?

1 Ответ

0 голосов
/ 15 февраля 2019

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

Это может вызвать такие же конфликты, например, если супер-администратор хочетчтобы видеть объекты обычного пользователя, тогда эта функция вам не подходит, потому что вы все время собираете объекты супер-администратора.

я бы использовал вашу функцию следующим образом

public function objects(){

   if ($this->hasRole("Super-Admin")) {
       return Object::query();
   }

   if ($this->hasRole("Admin")) {
       return Object::where('branch_id', '=', $this->branch()->pluck('id'));
   }

   return $this->hasMany(Object::class);
}

И затем на контроллерах при использовании

$user->objects();

вы получаете объекты объекта пользователя, который у вас есть в данный момент времени

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