Сделать доступ на RBAC (BD) + relation table
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Сделать доступ на RBAC (BD) + relation table
У меня такая задача. Есть водители и пассажиры. в auth_assignment у меня прописаны люди у которых может быть 2 роли (passenger, driver). Ну и конечно же admin . Мне нужно что бы у человека была 1 роль в один момент на Backend. Я хочу сделать отдельную табличку с unique (user_id) . В которую я буду складывать актуальное состояние человека. Одновременно мне нужно проверять если ты такая роль в auth_assignment (name). Кто нибудь сталкивался с этим или предложите другую архитектуру ?
Re: Сделать доступ на RBAC (BD) + relation table
Зачем? Что вам мешает использовать как есть - пользователя с несколькими ролями?
Если вы объясните, зачем вам это понадобилось, можно будет предложить какое-то решение. Сейчас задача непонятна.
Если вы объясните, зачем вам это понадобилось, можно будет предложить какое-то решение. Сейчас задача непонятна.
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Re: Сделать доступ на RBAC (BD) + relation table
Мне нужно что бы у человека была 1 роль что бы понять кто он в данный момент. в зависимости от роли я могу пускать на нужные действия человека. Например нужно сделать пересечение множеств в редис. Получается человек может быть и там и там. поэтому ввел новую таблицу, в который я вижу кто он в даныи момент. сам человек может быть в принципе шифером и пассажиром под одним account (user.id). Он не может быть пассажиром и водителем одновременно по бизнес логике приложения и мне легче отслеживать людей. если проще то нужно динамические роли сделать
Re: Сделать доступ на RBAC (BD) + relation table
Не могу понять, как именно бизнес-логика запрещает быть водителем и пассажиром одновременно. Ведь проверять можно любую роль по отдельности, они друг другу не мешают.
Ну ладно, допустим, нужно сделать какое-то переключение "активной роли", то делаете например так.
1. Заводите поле в табличке "user", в котором прописываете активную роль.
Назовём его, допустим, "status".
Просто строку, можно ENUM или VARCHAR, или число, что угодно.
Туда будете писать, например, "driver" или "passenger".
2. Делаете механизм переключения - при переключении будет обновляться это поле, туда будет записываться активная роль.
Проще говоря, нажал пользователь кнопку "стать водителем" - в поле "status" записалось "driver".
Нажал кнопку "стать пассажиром" - в поле "status" записалось "passenger".
3. Делаете правило isDriver и isPassenger.
В правило isDriver прописываете проверку "status=driver".
В правило isPassenger прописываете проверку "status=passenger".
4. Прикрепляете правило "isDriver" к роли "driver", правило "isPassenger" к роли "passenger".
Всё, дальше просто проверяете
Ну ладно, допустим, нужно сделать какое-то переключение "активной роли", то делаете например так.
1. Заводите поле в табличке "user", в котором прописываете активную роль.
Назовём его, допустим, "status".
Просто строку, можно ENUM или VARCHAR, или число, что угодно.
Туда будете писать, например, "driver" или "passenger".
2. Делаете механизм переключения - при переключении будет обновляться это поле, туда будет записываться активная роль.
Проще говоря, нажал пользователь кнопку "стать водителем" - в поле "status" записалось "driver".
Нажал кнопку "стать пассажиром" - в поле "status" записалось "passenger".
3. Делаете правило isDriver и isPassenger.
В правило isDriver прописываете проверку "status=driver".
В правило isPassenger прописываете проверку "status=passenger".
Код: Выделить всё
class DriverRule extends Rule
{
public $name = 'isDriver';
public function execute($user, $item, $params)
{
if (empty($user)) {
return false;
}
$userModel = User::findOne($user);
return $userModel->status === 'driver';
}
}
Всё, дальше просто проверяете
Код: Выделить всё
if (...->can("driver")) {
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Re: Сделать доступ на RBAC (BD) + relation table
то что нужно . спасибоNex-Otaku писал(а): ↑2017.07.23, 10:24 Не могу понять, как именно бизнес-логика запрещает быть водителем и пассажиром одновременно. Ведь проверять можно любую роль по отдельности, они друг другу не мешают.
Ну ладно, допустим, нужно сделать какое-то переключение "активной роли", то делаете например так.
1. Заводите поле в табличке "user", в котором прописываете активную роль.
Назовём его, допустим, "status".
Просто строку, можно ENUM или VARCHAR, или число, что угодно.
Туда будете писать, например, "driver" или "passenger".
2. Делаете механизм переключения - при переключении будет обновляться это поле, туда будет записываться активная роль.
Проще говоря, нажал пользователь кнопку "стать водителем" - в поле "status" записалось "driver".
Нажал кнопку "стать пассажиром" - в поле "status" записалось "passenger".
3. Делаете правило isDriver и isPassenger.
В правило isDriver прописываете проверку "status=driver".
В правило isPassenger прописываете проверку "status=passenger".
4. Прикрепляете правило "isDriver" к роли "driver", правило "isPassenger" к роли "passenger".Код: Выделить всё
class DriverRule extends Rule { public $name = 'isDriver'; public function execute($user, $item, $params) { if (empty($user)) { return false; } $userModel = User::findOne($user); return $userModel->status === 'driver'; } }
Всё, дальше просто проверяетеКод: Выделить всё
if (...->can("driver")) {