RBAC - если пользователи хранятся в двух таблицах

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

RBAC - если пользователи хранятся в двух таблицах

Сообщение kutsanov »

Может кто сталкивался с такой задачей
есть две таблицы: Пользователи и Админы
При авторизации выбирается кто входит Админ или просто пользователь. Ну и соответственно проверяется по той или иной таблице.
Не могу понять как прикрутить RBAC, вернее тут нужно два отдельных делать
Сделал следующее

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

        'authManager_adm' => [
            'class' => 'app\component\PhpAuthManager',
            'itemFile' => '@app/rbac/adm/items.php',
            'assignmentFile' => '@app/rbac/adm/assignments.php',
            'ruleFile' => '@app/rbac/adm/rules.php'
        ],
        'authManager_doctor' => [
            'class' => 'app\component\PhpAuthManager',
            'itemFile' => '@app/rbac/doctor/items.php',
            'assignmentFile' => '@app/rbac/doctor/assignments.php',
            'ruleFile' => '@app/rbac/doctor/rules.php'
        ],
При инициализации все красиво получилось. В нужных папочка создались нужные роли, права.

Но после запуска выкинуло исключение
Call to a member function checkAccess() on a non-object
и пришлось добавить

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

        'authManager' => [
            'class' => 'app\component\PhpAuthManager',
            'itemFile' => '@app/rbac/items.php',
            'assignmentFile' => '@app/rbac/assignments.php',
            'ruleFile' => '@app/rbac/rules.php'
        ],
после чего исключение уже не выкидывалось, но вот проверка

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

if (!\Yii::$app->user->can('adm')) {
уже не работала.
Я понимаю от чего это происходит. Проверка делается на основе authManager, а нужно authManager_adm. Но как заставить работать тот или иной менеджер?
Или я совсем не в ту сторону пошел? может есть какие другие решения.
Заранее благодарен.

--
на всякий случай код PhpAuthManager

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

namespace app\component;

use Yii;

class PhpAuthManager extends \yii\rbac\PhpManager
{
    private $_roles;

    public function init()
    {
        parent::init();
        if (\Yii::$app->user->isGuest) {
            return;
        }

    }

}
 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение zelenin »

ну а зачем вы создавали две таблицы юзеров?)
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение kutsanov »

zelenin писал(а):ну а зачем вы создавали две таблицы юзеров?)
думаю еще третья будет
1 таблица администраторов
2 таблица продавцов
3 таблица покупателей
--
можно конечно все в одну с меткой по какому-нибудь полю. Но это не правильно. Они очень сильно друг от друга отличаются.
лучше тогда уже сделать еще одну сводную таблицу специально для RBAC
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение zelenin »

kutsanov писал(а):
zelenin писал(а):ну а зачем вы создавали две таблицы юзеров?)
думаю еще третья будет
1 таблица администраторов
2 таблица продавцов
3 таблица покупателей
--
можно конечно все в одну с меткой по какому-нибудь полю. Но это не правильно. Они очень сильно друг от друга отличаются.
лучше тогда уже сделать еще одну сводную таблицу специально для RBAC
да нет, это правильно, и все так делают. и не могут таблицы юзеров отличаться друг от друга - они одно и то же.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение S c »

kutsanov писал(а):
zelenin писал(а):ну а зачем вы создавали две таблицы юзеров?)
думаю еще третья будет
1 таблица администраторов
2 таблица продавцов
3 таблица покупателей
--
можно конечно все в одну с меткой по какому-нибудь полю. Но это не правильно. Они очень сильно друг от друга отличаются.
лучше тогда уже сделать еще одну сводную таблицу специально для RBAC
Пользователь - сущность, которая может авторизироваться в системе. Для него есть таблица\сущность (например User). А дальше нужно было делать тип пользователя (отдельной меткой) и дополнительные таблицы отдельно для продавцов\покупателей (в зависимости от задачи). И в нужных местах подтягивать эти дополнительные данные. Тогда б и проблем не было. А сейчас вы грубо говоря желаете вообще разные сущности под одну волну подогнать, в обратном порядке. Для того и придумали наследование, чтоб решать подобные задачи.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение Йож »

Сделайте роли: админы, продавцы, покупатели.. А пользователи все в одной таблице
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение rugabarbo »

Содержать пользователей в одной таблице поможет STI: https://github.com/samdark/yii2-cookboo ... ritance.md

Таблица будет одна, а моделей несколько.

Уже обсуждали в какой-то теме недавно. Не нашёл её.
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение kutsanov »

Йож писал(а):Сделайте роли: админы, продавцы, покупатели.. А пользователи все в одной таблице
да делал я уже так, и не раз.
Хочу попробовать другое архитектурное решение.
Склоняюсь к решению создать одну таблицу, например USER с полями ID, ADM_ID, SELL_ID, BY_ID
и соответствующие таблицы
хотя тоже не нравится так
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение kutsanov »

Йож писал(а):Сделайте роли: админы, продавцы, покупатели.. А пользователи все в одной таблице
Роли такие и есть
просто хочется чтобы информация о пользователях была в разных таблицах.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение rugabarbo »

kutsanov писал(а):
Йож писал(а):Сделайте роли: админы, продавцы, покупатели.. А пользователи все в одной таблице
Роли такие и есть
просто хочется чтобы информация о пользователях была в разных таблицах.
В этом случае вам понадобится паттерн CTI, но он достаточно сложно реализуется на Yii2: https://github.com/yiisoft/yii2/issues/ ... t-38263185 - здесь один из ведущих разработчиков Yii-фреймворка пишет:
And I also think implementing CTI would be a difficult task. The main problem I see is that it looks like you need more than one query to get attributes for a class.
Carsten Brandt (автор коммента) очень квалифицированный специалист, прислушайтесь к его мнению и не пытайтесь реализовать CTI - это плохая идея. Отбросьте свои хотелки и используйте STI.
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

Re: RBAC - если пользователи хранятся в двух таблицах

Сообщение kutsanov »

AR не использую. Только DAO. Как то не ужился я с ним:(, поэтому вопрос с моделями вообще не стоял. Проблема была именно с RBAC.
Исходя из написанного и моих экспериментов, пришел к выводу, что созданная архитектура ошибочна. Хорошо что на ранней стадии выявилось:).
Сделал следующим образом
auth - (ID, ROLE, T) - пользователь, который и используется в RBAC
auth_adm (AUTH_ID (AUTH.ID), LOGIN, PW, ....) - таблица с админами
auth_sell (AUTH_ID (AUTH.ID), LOGIN, PW, ....) - таблица с продавцами
соответственно при авторизации или аутентификации используется запрос с JOIN на auth-auth_adm или auth-auth_sell соответственно.

Всем спасибо за советы!
Ответить