Сделать доступ на RBAC (BD) + relation table

Всё что касается построения API
Закрыто
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Сделать доступ на RBAC (BD) + relation table

Сообщение evgeniy123 » 2017.07.22, 17:03

У меня такая задача. Есть водители и пассажиры. в auth_assignment у меня прописаны люди у которых может быть 2 роли (passenger, driver). Ну и конечно же admin . Мне нужно что бы у человека была 1 роль в один момент на Backend. Я хочу сделать отдельную табличку с unique (user_id) . В которую я буду складывать актуальное состояние человека. Одновременно мне нужно проверять если ты такая роль в auth_assignment (name). Кто нибудь сталкивался с этим или предложите другую архитектуру ?

Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Сделать доступ на RBAC (BD) + relation table

Сообщение Nex-Otaku » 2017.07.22, 20:20

Зачем? Что вам мешает использовать как есть - пользователя с несколькими ролями?

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

evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Сделать доступ на RBAC (BD) + relation table

Сообщение evgeniy123 » 2017.07.23, 07:44

Nex-Otaku писал(а):
2017.07.22, 20:20
Зачем? Что вам мешает использовать как есть - пользователя с несколькими ролями?

Если вы объясните, зачем вам это понадобилось, можно будет предложить какое-то решение. Сейчас задача непонятна.
Мне нужно что бы у человека была 1 роль что бы понять кто он в данный момент. в зависимости от роли я могу пускать на нужные действия человека. Например нужно сделать пересечение множеств в редис. Получается человек может быть и там и там. поэтому ввел новую таблицу, в который я вижу кто он в даныи момент. сам человек может быть в принципе шифером и пассажиром под одним account (user.id). Он не может быть пассажиром и водителем одновременно по бизнес логике приложения и мне легче отслеживать людей. если проще то нужно динамические роли сделать

Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

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".

Код: Выделить всё

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';
    }
}
4. Прикрепляете правило "isDriver" к роли "driver", правило "isPassenger" к роли "passenger".

Всё, дальше просто проверяете

Код: Выделить всё

if (...->can("driver")) {

evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Сделать доступ на RBAC (BD) + relation table

Сообщение evgeniy123 » 2017.07.24, 18:08

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".

Код: Выделить всё

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';
    }
}
4. Прикрепляете правило "isDriver" к роли "driver", правило "isPassenger" к роли "passenger".

Всё, дальше просто проверяете

Код: Выделить всё

if (...->can("driver")) {
то что нужно . спасибо :)

Закрыто