Правильное использование RBAC

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Аватара пользователя
yiijeka
Сообщения: 3031
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

Re: Правильное использование RBAC

Сообщение yiijeka » 2018.08.06, 17:00

Раньше я так и делал, но реально это же странно - назначать всем одну и ту же роль и хранить это в базе... Логичнее хранить только данные о присвоении роли редактора и т.п.
Ну тогда странно, что вы ожидаете
...когда я пишу Yii::$app->user->can('user') для редактора возвращает true и ломает мне логику...
:)
По моему как раз логично что пользователь одновременно имеет только одну роль. Вот разрешений у роли может быть много. Но роль все таки одна.
Я же говорю, встречал такие системы в жизни - это имеет право на жизнь, просто частный случай использования RBAC. В стандарте указано, что Пользователь может иметь сколько угодно ролей, роль может иметь сколько угодно разрешений.

Использование одна роль- один пользователь удобно до определённого, пока система проста. Тоже самое касается создания на каждый чих разрешений - Yii не мешает проверять роли, маршруты, '@' и прочее , всё сделано, чтобы вы могли легко добиться желаемой цели. Делайте так пока всё просто и удобно вам, не надо усложнять ;)

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.06, 17:54

Ответьте пожалуйста по поводу этого:
Brainfuck писал(а):
2018.08.06, 16:40
Например какой-то раздел должен отображаться только для пользователя, но не для редактора. Так хочет начальство. Типа редактору этот раздел просто не нужен и будет мешаться. Как еще можно это ограничить? Создавать пермишн? Но мне кажется странным создавать 100500 пермишнов на каждый чих. Порой проще просто сравнить с ролью.

Кстати создание пермишна не спасет в данном случае т.к. если редактор одновременно и юзер, а я например дам этот пермишн только юзеру то для редактора раздел все равно будет отображаться.
Я правда не знаю как поступить в этом случае. Разве что удалить параметр defaultRoles и добавлять как раньше для каждого пользователя роль user. Тогда Yii::$app->user->can('user') на редакторе будет возвращать false. Как бы сделали вы?

Аватара пользователя
yiijeka
Сообщения: 3031
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

Re: Правильное использование RBAC

Сообщение yiijeka » 2018.08.06, 18:30

Например какой-то раздел должен отображаться только для пользователя, но не для редактора.
Связи выглядят так:

https://prnt.sc/kfcssl

На viewSection добавляем правило ViewSectionRule, в котором пишем

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

public function execute($user, $item, $params) {
    return isset($params['section_id']) && AccessToSection::find()->where(['user_id'=>$user->id, 'section_id'=>$params['section_id']])->exists();
}

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.07, 07:12

yiijeka писал(а):
2018.08.06, 18:30
Например какой-то раздел должен отображаться только для пользователя, но не для редактора.
Связи выглядят так:

https://prnt.sc/kfcssl

На viewSection добавляем правило ViewSectionRule, в котором пишем

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

public function execute($user, $item, $params) {
    return isset($params['section_id']) && AccessToSection::find()->where(['user_id'=>$user->id, 'section_id'=>$params['section_id']])->exists();
}
Честно говоря я вообще не понял эту вашу абстракцию. Что такое viewSection? Что такое section_id? Что такое AccessToSection? :shock:

Аватара пользователя
maleks
Сообщения: 1643
Зарегистрирован: 2012.12.26, 12:56

Re: Правильное использование RBAC

Сообщение maleks » 2018.08.07, 08:21

Brainfuck писал(а):
2018.08.06, 16:14
Еще появился вопрос по дефолтным ролям. Вот я прописал в конфиге:

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

'authManager' => [
	'class' => 'yii\rbac\DbManager',
	'defaultRoles' => ['user']
],
И все по умолчанию имеют роль юзера.
Вы же понимаете, что если на роли user у вас нет никаких правил, то оно будет применяться и к анонимам тоже?

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.07, 08:25

maleks писал(а):
2018.08.07, 08:21
Brainfuck писал(а):
2018.08.06, 16:14
Еще появился вопрос по дефолтным ролям. Вот я прописал в конфиге:

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

'authManager' => [
	'class' => 'yii\rbac\DbManager',
	'defaultRoles' => ['user']
],
И все по умолчанию имеют роль юзера.
Вы же понимаете, что если на роли user у вас нет никаких правил, то оно будет применяться и к анонимам тоже?
К незалогиненным?! Серьезно? Нет, не знал. Вот ведь бред... Зачем так сделано? :shock: И как с этим связаны правила? Что, если я повешу на эту роль какие-то правила (а они вообще-то висят) то к незалогиненным уже не будет применяться?

Аватара пользователя
maleks
Сообщения: 1643
Зарегистрирован: 2012.12.26, 12:56

Re: Правильное использование RBAC

Сообщение maleks » 2018.08.07, 08:34

создаете роль "незареганный", ставите на него правило чтобы проверяло что незареганный

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

    public function execute($user, $item, $params)
    {
        return \Yii::$app->user->isGuest;
    } 
, регистрируете ее в defaultRoles
Все, можете теперь этой роли назначать какие хотите права, это все будут права незареганных.

То же самое применимо и для зареганных.

defaultRoles - тут это типа короткий способ назначения прав, чтобы не выстраивать иерархии ролей и реализовать их назначение пользователям.

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.07, 09:20

maleks писал(а):
2018.08.07, 08:34
создаете роль "незареганный", ставите на него правило чтобы проверяло что незареганный

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

    public function execute($user, $item, $params)
    {
        return \Yii::$app->user->isGuest;
    } 
, регистрируете ее в defaultRoles
Все, можете теперь этой роли назначать какие хотите права, это все будут права незареганных.

То же самое применимо и для зареганных.

defaultRoles - тут это типа короткий способ назначения прав, чтобы не выстраивать иерархии ролей и реализовать их назначение пользователям.
Хорошо. Но это не решает проблему описанную выше (то что редактор как-бы наследуется от юзера в случае использования defaultRoles). Вот yiijeka сказал что один юзер = одна роль это типа не по фэншую. Но как правильно он не объяснил. Я привел конкретный пример: надо ограничить доступ к разделу для всех кроме юзеров (чтобы только юзеры его видели). Как это сделать "по фэншую"? ;)

Аватара пользователя
yiijeka
Сообщения: 3031
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

Re: Правильное использование RBAC

Сообщение yiijeka » 2018.08.07, 09:48

> Но как правильно он не объяснил
:)

тут всё объяснение

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.07, 09:53

yiijeka писал(а):
2018.08.07, 09:48
> Но как правильно он не объяснил
:)

тут всё объяснение
Brainfuck писал(а):
2018.08.07, 07:12
Честно говоря я вообще не понял эту вашу абстракцию. Что такое viewSection? Что такое section_id? Что такое AccessToSection? :shock:

Аватара пользователя
yiijeka
Сообщения: 3031
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

Re: Правильное использование RBAC

Сообщение yiijeka » 2018.08.07, 10:09

Изначально вопрос звучал так:

Например какой-то раздел должен отображаться только для пользователя, но не для редактора.

На картинке есть три блока:
user ,
editor
viewSection .

Загадка: Что такое viewSection?

Аватара пользователя
maleks
Сообщения: 1643
Зарегистрирован: 2012.12.26, 12:56

Re: Правильное использование RBAC

Сообщение maleks » 2018.08.08, 10:25

Brainfuck писал(а):
2018.08.07, 09:20
Хорошо. Но это не решает проблему описанную выше (то что редактор как-бы наследуется от юзера в случае использования defaultRoles).
Чтобы он не наследовался достаточно в правиле, прикрепленном сделать проверку: неГость && !$user->can('editor')
Но это все не так красиво получается на практике, запросы лишние.
Brainfuck писал(а):
2018.08.07, 09:20
Вот yiijeka сказал что один юзер = одна роль это типа не по фэншую.
Один юзер = одна роль - это один из самых упрощенных вариантов (и легких). Хранится эта роль в таблице user и каждый раз при загрузке ему "присваивается".
Brainfuck писал(а):
2018.08.07, 09:20
Я привел конкретный пример: надо ограничить доступ к разделу для всех кроме юзеров (чтобы только юзеры его видели). Как это сделать "по фэншую"? ;)
Я бы сделал все таки как выше говорили, присваивать эту роль пользователю тогда когда он ее заслужил.
Есть например какой то сервис UserActivateService, который делает юзера "активным", например после подтверждения через email, вот тут ему и добавлять эту роль.
Соотв. если это модератор, то он эту роль никогда не получит, или она будет у него отнята и никаких пересечений не будет.

andku83
Сообщения: 797
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Правильное использование RBAC

Сообщение andku83 » 2018.08.09, 19:09

Brainfuck писал(а):
2018.08.07, 09:20

Чтобы он не наследовался достаточно ...
... его не наследовать.

Если вам не нужно чтобы editor обладал правами user - не добавляйте его как child для editor.
И тогда в случае с RBAC еще будет возможность использовать роли по отдельности и вместе (назначив обе роли пользователю), усли вдруг возникнет такая необходимость.

Brainfuck
Сообщения: 172
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное использование RBAC

Сообщение Brainfuck » 2018.08.11, 08:58

andku83 писал(а):
2018.08.09, 19:09
Brainfuck писал(а):
2018.08.07, 09:20

Чтобы он не наследовался достаточно ...
... его не наследовать.

Если вам не нужно чтобы editor обладал правами user - не добавляйте его как child для editor.
И тогда в случае с RBAC еще будет возможность использовать роли по отдельности и вместе (назначив обе роли пользователю), усли вдруг возникнет такая необходимость.
Вы бы хоть тему почитали прежде чем отвечать. Я не наследую его. Это происходит в следствии добавления user в defaultRoles.

andku83
Сообщения: 797
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Правильное использование RBAC

Сообщение andku83 » 2018.08.11, 18:56

Brainfuck писал(а):
2018.08.11, 08:58
Вы бы хоть тему почитали прежде чем отвечать. Я не наследую его. Это происходит в следствии добавления user в defaultRoles.
Половина темы, как и первый вопрос вообще не об этом, ну да ладно.
Brainfuck писал(а):
2018.08.07, 08:25
maleks писал(а):
2018.08.07, 08:21
Brainfuck писал(а):
2018.08.06, 16:14
Еще появился вопрос по дефолтным ролям. Вот я прописал в конфиге:

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

'authManager' => [
	'class' => 'yii\rbac\DbManager',
	'defaultRoles' => ['user']
],
И все по умолчанию имеют роль юзера.
Вы же понимаете, что если на роли user у вас нет никаких правил, то оно будет применяться и к анонимам тоже?
К незалогиненным?! Серьезно? Нет, не знал. Вот ведь бред... Зачем так сделано? :shock: И как с этим связаны правила? Что, если я повешу на эту роль какие-то правила (а они вообще-то висят) то к незалогиненным уже не будет применяться?
https://github.com/yiisoft/yii2/blob/ma ... er.php#L31
Судя по вашей логике вы собираетесь незалогиненым пользователям разрешать писать, а потом еще и редактировать посты/статьи?

Ответить