Страница 1 из 3

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

Добавлено: 2014.04.26, 02:52
savenko
Здравствуйте!
Не могу понять как работает 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'],
                    ],
                ],
            ],
        ];
    }

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

Добавлено: 2014.04.26, 03:12
lancedevnull

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

    /**
     * @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

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

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

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

Добавлено: 2014.04.26, 10:56
vova07
Проверка у вас не работает, так как вы не сделали привязку.
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) Можно смело использовать роли и проверки прав доступа в соём коде.

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

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

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

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

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

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

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

Добавлено: 2014.05.04, 11:01
agrail
Поэтому нужно использовать defaultRoles.

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

Добавлено: 2014.05.08, 08:47
Shappy
Дабы не использовать запись в 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;

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

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

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

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

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

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

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

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

Добавлено: 2014.11.07, 12:38
vova07
Процесс работы 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!'
} 
Вроде все, если есть еще вопросы, задавайте.

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

Добавлено: 2014.11.07, 22:09
VaNnOrus
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')){ тут что-то показывал в тулбаре } - ничего не вывелось. Естественно право "тест" до этого создал и присвоил его роли, которая была установлена юзеру, с которого проверял.

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

Добавлено: 2014.11.09, 22:57
BrusSENS
Коллеги, скажите, а кто нибудь пробовал хранить в базе всю структуру RBAC и генерить её в файл? Вот сейчас думаю о таком подходе, может кто сможет поделиться опытом :)

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

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

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

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

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

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

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

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

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

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

Добавлено: 2014.11.10, 10:44
VaNnOrus
Продолжаю ковырять rbac...

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

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

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

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

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

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

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

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

Добавлено: 2014.11.10, 11:55
BrusSENS
zelenin писал(а): если вы будете выгружать из БД, то да.
не надо этого делать.
Насколько я заметил, то и при описании в файле они тоже записываются для каждого пользователя
UPD: Получается, что вариант только один - хранение в БД? (Для более менее крупных проектов)