[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Права доступа для опредленных записей в базе
sx000
Магазин на базе Laravel 5.4.
Есть заказы на две страны: 1 и 2.
Мне нужно чтоб менеджер из 1 страны видел только заказы для страны 1, соответственно 2 менеджер видел только заказы с страны 2.
Понятно что в базе можно сделать поле, с отношением ... еще можно сделать связующую таблицу.
А что если завтра появиться третья страна и мне надо будет менеджеру 1 предоставить доступ к записям страны 3, и новому менеджеру 3 предоставить доступ к стране 3.
Как можно гибко это реализовать? И самое главное понять!!! smile

я так понимаю что мы имеем юзеров
1 2 3 … X
и имеем группы, фактически юзеры не имеют доступов ни к чему, имеют только группы.
Те создаем таблицу groups, и при создании в ней записи группы скажем
1 - managaers Russia
2 - managers Ukraine
Создаем таблицу связывающую таблицу users и groups, называем ее connection
где будут перечисляться ID юзеров и соответственно ID группы в которую он имеет отношение. И так может 1 юзер у нас иметь отношение сразу в несколько групп.

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

Вот я примерно так вижу, может сильно запутанно?

-----------

еще как вариант сделать ответственного за конкретный заказ, согласно каким то критериям, например. Зашел заказ… мы создаем правило:
если заказ содержит russia то мы направляем рандомному то из отдела managers russia, ну или показываем всем пока кто то не кликнул на кнопку взял заказ например он исчезает из входящего пула и становиться доступен только ответственному человеку. Вообще такая система реализована в битриксе, как бы логически продумать ее у себя, там очень гибко можно правила настраивать. Есть по сути только менеджеры и доступ к сущностям как бы стандартная система уровня доступов.

Есть проще вариант?

Спасибо за помощь!
Rand
Ставишь этот пакет: https://github.com/spatie/laravel-permission

В модели пользователя-менеджера добавляешь трейт HasRoles:
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class Manager extends Authenticatable
{
use HasRoles;

Создаешь привилегии:
use Spatie\Permission\Models\Permission;

Permission::create(['name' => 'orders.russia']);
Permission::create(['name' => 'orders.ukraine ']);

Теперь несколько вариантов - либо дать полномочия конкретному пользователю напрямую:
$manager = Manager::find($id);
$manger->givePermissionTo('orders.russia', 'orders.ukraine');

Либо предварительно создать роль (группу), добавить туда эти полномочия, и пользователю уже назначать непосредственно роли:
use Spatie\Permission\Models\Role;

// Создаем роли
$russanManager = Role::create(['name' => 'russian manager']);
$ukrainianManager = Role::create(['name' => 'ukrainian manager']);

// Добавляем пермишены ролям
$russanManager->givePermissionTo('orders.russia');
$ukrainianManager->givePermissionTo('orders.ukraine');

// Добавляем роли пользователям
$manager = Manager::find($id);
$manger->assignRole('russian manager', 'ukrainian manager');

Для защиты ресурсов используем мидлвары на роуты: https://github.com/spatie/laravel-permissio...ng-a-middleware
Для проверки полномочий внутри шаблонов есть специальные blade-директивы, также можно проверить пермишен напрямую у пользователя:
$manager->hasPermissionTo('orders.ukraine');

Автор пакета - один из самых популярных вендоров для Laravel, поэтому в данном случае рекомендую не изобретать велосипед.
Цитата (sx000 @ 3.10.2018 - 01:30)
пока кто то не кликнул на кнопку взял заказ

По мне так это лучший варинат, т.к. сотрудники уходят в отпуск, болеют, т.е. при рандомном распределении накладываются дополнительные условия, что менеджер должен быть онлайн, и не ушел курить. Тут ещё могу посоветовать, если время обработки заказа критично - делать отдельную таблицу со связями заказ-менеджер + время взятия заказа, это не только для целей чтобы два сотрудника одновременно один заказ не взяли, но и если со времени взятия заказа прошло, например, более 15 минут, заказ мог взять другой сотрудник и клиент не ждал, пока там первый сотрудник вернется из курилки.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.