Не знаю насколько поможет мой опыт т.к. я сам только учусь) но я сделал так:
3 таблицы
Roles
role_perms
perms
Связываем роли и пермы через manytomany.
В AuthServiceProvider прописываем правила. Типа
Gate::define('CREATE_PRODUCT', function($user){
return $user->canDo(3);
});
На каждый пермишен или автоматизировать.
В модели User делаем проверку
public function canDo($perm_id) {
foreach ($this->roles as $role) {
foreach ($role->perms as $perm) {
if ($perm_id==$perm->id) {
return true; }}}}
Теперь подключив Gate к контроллеру можно делать перед выполнением метода.
if (Gate::denies('CREATE_PRODUCT ')) {
abort(404);
}
И в шаблоне
@can ('CREATE_PRODUCT’)
Код создания продукта
@endcan
Все. Можно ограничить еще в роутах (через мидделварь, эт о просто). Что там еще? Назначать роли в контроллерах просто. Типа
If($user->isDirector() and $company->type(‘it’))
{
$user->roles()->attach($id);
}
Attach делает запись в промежуточной таблице
Type – метод у компаний, который ищет по массиву типов
isDirector - метод у юзера типа
public function isDirector()
{
if роль == director return true;
return false;
}
Или получать роль через имя
public function getRole($name)
{
return $this->roles()->where('name', $name);
}
Но лучше (для меня) создать дату с ролями в модели User (типа констант) и искать по id, а не по name(я так сделал)
Что касается разных ролей для каждой компании. Можно связать компании роли и юзеры и получать права записью типа
$user->company($id)->roles();