Yii2 авторизация и Роли

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

Yii2 авторизация и Роли

Сообщение savenko » 2014.04.26, 02:52

Здравствуйте!
Не могу понять как работает RBAC.
Пожалуйста, не нужно указывать ссылки на английскую инструкцию в качесве ответа.

В конфиге указал

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

  'authManager' => [
            'class' => 'yii\rbac\PhpManager',
            'authFile' => '@app/config/rbac.php'
        ],
В rbac.php написал

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

<?php

return array (
    'items' =>array(
        'admin'=>array (
            'type'=>1,
            'name'=>'admin',
            'ruleName' => 'admin'
        )
    )
);
Вопрос как после авторизации пользователю назначить права админа? Не работает Yii::$app->user->can('admin'), пишет Rule not found: admin
+ не работет если в контроллере указываю роль пользователя 'admin'

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

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index','clearchache'],
                        'allow' => true,
                        'roles' => ['admin'],
                    ],
                ],
            ],
        ];
    }

lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Yii2 авторизация и Роли

Сообщение lancedevnull » 2014.04.26, 03:12

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

    /**
     * @var string name of the rule associated with this item
     */
    public $ruleName;
 
это нужно, если вы создаете свой класс MyRule extends Rule, т.е. вам оно не нужно, если хотите расшифровать, то юзайте

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

    /**
     * @var string the item description
     */
    public $description;
 
(c) yiisoft/yii2/rbac/Item.php

savenko
Сообщения: 22
Зарегистрирован: 2012.07.27, 14:53

Re: Yii2 авторизация и Роли

Сообщение savenko » 2014.04.26, 03:17

По шагам, пожалуйста:
1) Описание ролей (Админы и пользователи)
2) Привязка ролей к пользователям после авторизации (В бд есть запись у кого какая роль "admin", "user")
3) Проверка пользователя (Ты админ? Ты пользователь?)

Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Yii2 авторизация и Роли

Сообщение vova07 » 2014.04.26, 10:56

Проверка у вас не работает, так как вы не сделали привязку.
1) Нужно описать в конфиге RBAC компонент. (Вы это сделали)
2) Нужно создать файл "rbac.php" и описать там все роли. (Вы это сделали)
3) Нужно создать правило для гостя.
4) Если используете свои правила, то для них нужно указывать "name" параметр.
5) Нужно сделать привязку пользователя к роли. Это лучше всего делать в момент регистрации нового пользователя, как только он был успешно добавлен в базу. Из доков:

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

public static function create($attributes)
{
    /** @var User $user */
    $user = new static();
    $user->setAttributes($attributes);
    $user->setPassword($attributes['password']);
    $user->generateAuthKey();
    if ($user->save()) {

        // Вот тут происходит сама привязка:
        $auth = Yii::$app->authManager;
        $adminRole = $auth->getRole('author');
        $auth->assign($adminRole, $user->getId());

        return $user;
    } else {
        return null;
    }
}
6) Можно смело использовать роли и проверки прав доступа в соём коде.

savenko
Сообщения: 22
Зарегистрирован: 2012.07.27, 14:53

Re: Yii2 авторизация и Роли

Сообщение savenko » 2014.04.26, 12:55

Большое спасибо за подробный ответ!
Последнее: как лучше всего добавить правило к пользователю?
Пока не сделал

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

$rule = new AdminRule();
$auth->add($rule); 
то код не хотел работать.

P.S. Не понимаю смысла.
В $auth->assign($adminRole, 1);
Уже указано что пользователь с id 1-это Админ.
Зачем указывать еще правило в котором в методе execute я пишу
return \Yii::$app->user->id==$user;

Переписывается файл rbac.php на сервере (Получается запутаным), если со временем необходимо будет дописать роли то вполне вероятно что файл перепишется и все роли потрутся. + если есть 2 версии сайта (Для отладки и боевой), то просто так файл уже будет не синхронизировать(((

agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: Yii2 авторизация и Роли

Сообщение agrail » 2014.05.04, 11:01

Поэтому нужно использовать defaultRoles.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Yii2 авторизация и Роли

Сообщение Shappy » 2014.05.08, 08:47

Дабы не использовать запись в rbac и defaultRoles, хочется нормально разобраться как делать авторизацию и хранение ролей в таблицах... Я так понимаю нужно использовать DbManager для этого... Также уже есть файл с миграцией для этого дела... Хочется спросить как действовать и что значат таблицы...
Как я понял auth_rule таблица - это название правила, дата создания...,
auth_item здесь какая-то конкретная роль и мы ее описываем, например "Пользователь",
auth_item_child - таблица для наследования ролей,
auth_assignment - в этой таблице записывается какая роль какому юзеру присваивается. Если что-то не так, поправьте пожалуйста...

Сам вопрос: что нам нужно для организации авторизации и записи в эти таблицы:)
Я понимаю так:
1. в конфиге DbManager прописываем.
2. Должна быть минимальная таблица User минимум - это как в basic-приложении:
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;
3. Ну и дальше собственно не понятно, куда копать и как реализовывать... Какие методы должны быть... Так же не очень понятно для чего нужны эти поля вообще: public $authKey; public $accessToken;

Если кто-нибудь распишет, буду очень благодарен... В документации пока нету как я понял организации всего этого дела через таблицы...

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Yii2 авторизация и Роли

Сообщение VaNnOrus » 2014.11.07, 11:10

Ребят, ну ответьте уже хоть кто-нибудь хоть в одной теме по рбак'у :С

За неимением нормальной документации начал рыть исходники. Выяснил, что, оказывается, type у item'а - это либо 1 (право, permission), либо 2 (роль, role). Хоть что-то проясняться стало.

Кто-нибудь может по-человечески рассказать как работать с rbac на бд?

Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Yii2 авторизация и Роли

Сообщение vova07 » 2014.11.07, 12:12

А что конкретно интересует?
Задавайте конкретные вопросы, думаю ответы не заставят себя ждать.

Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Yii2 авторизация и Роли

Сообщение vova07 » 2014.11.07, 12:38

Процесс работы RBAC в Yii 2 очень простой. Хочу заметить что разница между DbManager и PhpManager одна, место хранения данных. Первый хранит данные в БД, второй в ПХП файлах. все остальное это один интерфейс, с разной реализацией.
Для того чтобы начать работу с RBAC (любым) нужно:

- Сконфигурировать "authManager" в своем конфиг файле.
- Если выбран метод хранения в БД, то нужно запустить миграции для создания нужных таблиц, или воспользоваться готовым дампом.
- Завести таблицу с пользователями, структура может быть любой, и никаких спец требований у самого RBAC тут нет. Главное что есть "PrimaryKey"/
- Создать свой список ролей. Легче всего для это-го можно использовать API, пример создания обычных правил можно посмотреть тут например. В данном примере создание самих ролей было отделено в свой консольный контроллер, для удобства. Данное действие делается один раз. Конечно если нужны дополнительные роли то пишем другие экшены и добавляем их по необходимости. Думаю описывать методы не стоит, так как там все интуитивно понятно.
- После того как у нас есть таблица с пользователями, и есть наши таблицы с заполненными правилами, осталось только сделать присваивание. Присваивать роли пользователю обычно нужно при регистрации. Вернее после сохранения нового пользователя делается присваивание его роли: живой пример тут:

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

$auth = Yii::$app->authManager; // Создаём экземпляр менеджера
/*
Определяем название роли.
 В данном примере поле "role" содержит  название роли что-то типа: "admin" или "moderator", эти названия уже есть в БД, 
 и были созданы через API что в пунтке выше.
 */
$name = $this->role ? $this->role : self::ROLE_DEFAULT;
$role = $auth->getRole($name); // Находим нашу роль в базе, по его названию.
if (!$insert) { // Проверяем если это не первое сохранение
    $auth->revokeAll($this->id); // Если это обновление записи, то удаляем все права и роли нашего пользователя, так как мы ему присваиваем новые.
}
/*
Само присваивание роли. 
$this->id тут является ИД-шником пользователя, хотя у вас это может быть что-то другое. 
То есть ваш "PrimaryKey".
*/
$auth->assign($role, $this->id);  

- Процесс прикрутки РБАК окончен. При обновлении делается тоже самое, и в примере выше это уже учтено. Теперь все что осталось это использовать проверки в нужных местах, типа такого:

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

if (Yii::$app->user->can('admin')) { // "admin" является названием роли которое было создано через API "authManger"-а.
    echo 'Hello, Admin!'
} 
Вроде все, если есть еще вопросы, задавайте.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Yii2 авторизация и Роли

Сообщение VaNnOrus » 2014.11.07, 22:09

vova07 писал(а):А что конкретно интересует?
Задавайте конкретные вопросы, думаю ответы не заставят себя ждать.
Пытаюсь использовать RBAC модуль yii2-admin с DbManager.
Описанные выше шаги вплоть до создания ролей/прав и их привязки к юзерам сделал, но ничего не работает. Постоянно 403.
Не могу понять как это работает.
Настроил модуль по инструкции:

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

        'authManager' => [
            'class' => \mdm\admin\components\DbManager::className(),
            'defaultRoles' => [ 'Guest' ],
        ],
...
    'as access' => [
        'class' => \mdm\admin\components\AccessControl::className(),
        'allowActions' => [
            'site/login',
            'site/logout',
        ]
    ], 
Для AccessControl указаны исключения - вот они прекрасно работают. Из поведения в контроллере выпилил "access" вообще. Что делать дальше не представляю. Пробовал создать право index и site/index - никаких эмоций, 403.
Тулбар меню нормально выводится, поэтому решил попробовать там что-то вывести. if (Yii::$app->user->can('test')){ тут что-то показывал в тулбаре } - ничего не вывелось. Естественно право "тест" до этого создал и присвоил его роли, которая была установлена юзеру, с которого проверял.

Аватара пользователя
BrusSENS
Сообщения: 499
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Yii2 авторизация и Роли

Сообщение BrusSENS » 2014.11.09, 22:57

Коллеги, скажите, а кто нибудь пробовал хранить в базе всю структуру RBAC и генерить её в файл? Вот сейчас думаю о таком подходе, может кто сможет поделиться опытом :)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

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

Re: Yii2 авторизация и Роли

Сообщение zelenin » 2014.11.09, 23:15

BrusSENS писал(а):Коллеги, скажите, а кто нибудь пробовал хранить в базе всю структуру RBAC и генерить её в файл? Вот сейчас думаю о таком подходе, может кто сможет поделиться опытом :)
непонятно в чем профит?
есть три подхода:
1. Описывать все в php-файле, используя PhpManager
2. Описывать все в php-файле, импортируя его в БД
3. Напрямую работать с БД - самый геморный вариант, но единственный, позволяющий из админки точно настраивать права

Аватара пользователя
BrusSENS
Сообщения: 499
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Yii2 авторизация и Роли

Сообщение BrusSENS » 2014.11.10, 07:52

zelenin писал(а): непонятно в чем профит?
Ну хочется реализовать хранение прав в базе и уже рендерить всё это в файл, что бы не тянуть из базы всё это :)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

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

Re: Yii2 авторизация и Роли

Сообщение zelenin » 2014.11.10, 10:19

BrusSENS писал(а):
zelenin писал(а): непонятно в чем профит?
Ну хочется реализовать хранение прав в базе и уже рендерить всё это в файл, что бы не тянуть из базы всё это :)
в чем профит?

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Yii2 авторизация и Роли

Сообщение VaNnOrus » 2014.11.10, 10:23

BrusSENS писал(а):
zelenin писал(а): непонятно в чем профит?
Ну хочется реализовать хранение прав в базе и уже рендерить всё это в файл, что бы не тянуть из базы всё это :)
Если не нужна бд - не используйте ее вообще. Это же очевидно.

А вообще, не вижу проблемы написать скрипт, собирающий текстовый файл нужной структуры с использованием данных из базы.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Yii2 авторизация и Роли

Сообщение VaNnOrus » 2014.11.10, 10:44

Продолжаю ковырять rbac...

Что интересно - убрал из настроек блок as access - естественно никаких 403.
Проверил в контроллере ( Yii::$app->user->can(право) ) - все работает. Проверка ролей, проверка прав.

Замечательно, казалось бы, но нет. Теряется при таком раскладе самое главное - по умолчанию все должно быть запрещено, а разрешено только то, на что даны права.
Как я понимаю нужно как-то иначе настраивать as access, но как? Настройки брал из доков модуля...

Апд. Обожемой...вопрос снят.
Оказывается права нужно указывать с ведущим "/". В документации к модулю-то указать это, конечно, не нужно...пусть пользователи становятся экстрасенсами...
Когда ж разработчики начнут нормально документацию писать...

Аватара пользователя
BrusSENS
Сообщения: 499
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Yii2 авторизация и Роли

Сообщение BrusSENS » 2014.11.10, 11:43

VaNnOrus писал(а): А вообще, не вижу проблемы написать скрипт, собирающий текстовый файл нужной структуры с использованием данных из базы.
Не проблема, спору нет.
Но сейчас столкнулся с другой неприятной штуковиной. Как можно заметить, при присвоении роли, она прописывается явно, не как в Yii1 можно это было делать. Так вот собственно вся некрасивость в том, что судя по всему, если будет 1000 000 пользователей, то файл раздуется до ненормальных размеров что ли?
UPD:
VaNnOrus писал(а):В документации к модулю-то указать это, конечно, не нужно...пусть пользователи становятся экстрасенсами...
Когда ж разработчики начнут нормально документацию писать...
Это вы где такой модуль нашли? Yii2-start что ли?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

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

Re: Yii2 авторизация и Роли

Сообщение zelenin » 2014.11.10, 11:53

BrusSENS писал(а): Но сейчас столкнулся с другой неприятной штуковиной. Как можно заметить, при присвоении роли, она прописывается явно, не как в Yii1 можно это было делать. Так вот собственно вся некрасивость в том, что судя по всему, если будет 1000 000 пользователей, то файл раздуется до ненормальных размеров что ли?
если вы будете выгружать из БД, то да.
не надо этого делать.

Аватара пользователя
BrusSENS
Сообщения: 499
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Yii2 авторизация и Роли

Сообщение BrusSENS » 2014.11.10, 11:55

zelenin писал(а): если вы будете выгружать из БД, то да.
не надо этого делать.
Насколько я заметил, то и при описании в файле они тоже записываются для каждого пользователя
UPD: Получается, что вариант только один - хранение в БД? (Для более менее крупных проектов)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

Ответить