Сомнения в отношении Yii2 RBAC

Я разрабатываю веб-приложения с использованием Yii 1.1.14 до сих пор, но теперь настало время для обновления.

Компания, в которой я работаю, разработала собственную систему контроля доступа, и с ней все было в порядке, пока я не увидел, что это было на самом деле... Комбинация из 8 таблиц в базе данных (не считая таблицы пользователей) с кучей внешних ключей.

  • 1 таблица для контроллеров
  • 1 таблица действий
  • 1 таблица для категорий меню
  • 1 таблица для типов пользователей
  • И другие таблицы в основном просто соединяют 2 или 3 из этих таблиц за раз.

Это хорошо работает, но, с моей точки зрения, очень много времени для поддержания всех этих таблиц, и в какой-то момент, когда ваше приложение выходит в интернет, если оно попадает на определенное количество пользователей, оно может стать очень медленным. особенно потому, что 2 из этих таблиц имеют первичный ключ таблицы пользователя в качестве внешнего ключа.

Итак, я решил, что, когда я начну разработку на Yii 2, я собираюсь начать использовать RBAC, поэтому начал искать учебники онлайн... Только нахождение множества разных версий одного и того же кода с ролью автора, и разрешения для создания или обновления сообщений.

Я нашел комбинацию из 5 видео на Youtube, но они касаются Yii 1 RBAC. Они были полезны, потому что мне удалось понять большинство функциональных возможностей RBAC, но у меня все еще есть некоторые сомнения в том, что я буду перечислите ниже. И имейте в виду, что для этой системы контроля доступа я использую класс DBManager.

Мои сомнения

  • Yii 1 RBAC имел 3 таблицы: auth_assignment, auth_item и auth_item_child. Теперь в Yii 2 RBAC появляется новая таблица, которая называется auth_rule, и я до сих пор не понимаю, что делает эта конкретная таблица, как ее использовать или как ее заполнять.

  • Я вижу, что можно ограничить доступ пользователей к некоторым действиям с помощью метода поведения контроллера и назначить доступ к некоторым действиям в зависимости от роли пользователя, но когда дело доходит до этого, я должен разделить мой вопрос в 2:

    2,1. Сначала:. Если вы можете просто ограничить доступ к действиям, настроив его в методе поведения, то, что использование разрешений на сохранение в таблице auth_item?

    2,2. Вторые: Если вы решили контролировать доступ в соответствии с разрешениями, то как именно вы это делаете, потому что я нахожу, что я пишу следующий код внутри каждой функции, и я не думаю, что использование RBAC предполагается, что это утомительно. Должен быть другой способ.

    public function actionView($id)
    {
        if(Yii::$app->user->can('view-users')){
            return $this->render('view', [
                'model' => $this->findModel($id),
            ]);
        }else{
            #Redirect to a custom made action that will show a view 
            #with a custom error message
            $this->redirect(['//site/notauthorized']);
        }
    }
    
  • Из-за системы контроля доступа, которую мы используем прямо сейчас, когда пользователь входит в систему, выполняется сложный запрос, который в конечном итоге возвращает массив, который будет сохранен как переменная сеанса, и будет использоваться для создайте меню с таким количеством списков dropdownlists, что и категории меню, к которым принадлежат контроллеры, к которым пользователь имеет доступ. Как это можно сделать с RBAC?

Ответ 1

Я могу только ответить на 2.2 вашего вопроса, так как 3 вообще не звучит, как что-то, что должен сделать RBAC. Однако вы могли бы получить необходимую информацию из таблицы правил, если бы вы следовали соглашению об именах, которое соответствовало вашим контроллерам или действиям.

В ответ на 2.2, хотя:

Вы можете просто установить такое поведение:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['view'],
                    'roles' => ['view-users'], //<-- Note, rule instead of role
                ],
        ]
    ]
}

Это не решает другую проблему разрешений стиля "view-own-users", так как это необходимо для проверки модели ActiveRecord (ну, по крайней мере, в моем приложении). Если вы хотите этого добиться, посмотрите здесь мой пост на форумах Yii:

http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

Ответ 2

Я использую его в одном из простейших методов, я использую их в поведении моего контроллера.

 public function behaviors()
    {

        return [
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['sysadmin'],
                        'actions' => ['index','view','update'],
                    ],
                    [
                        'allow' => true,
                        'roles' => ['staff'],
                        'actions' => ['index','create','update','view'],
                    ],
                ],
            ],
        ];

    }

Здесь роли - это те, которые созданы в таблице auth-item в базе данных, и они были назначены для пользователей в таблице присвоения имен. В поведении мы просто используем его, как указано выше. В приведенном выше коде sysadmin может иметь доступ к действию индекса, просмотра и обновления, тогда как персонал может иметь доступ к действию индекса, создавать, обновлять и просматривать.

Ответ 3

Yii2 нуждается в небольшой настройке, когда дело доходит до использования RBAC под вашими контроллерами AccessControl. Я обошел его, создав свой собственный файл AccessRule.

namespace app\components;

use Yii;

class AccessRule extends \yii\filters\AccessRule
{
    protected function matchRole($user)
    {
        if (empty($this->roles)) {
            return true;
        }
        foreach ($this->roles as $role) {
            if(Yii::$app->authManager->checkAccess($user->identity->code, $role))
                return true;
        }
        return false;
}

то в вашем контроллере вы можете использовать что-то вроде этого:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'ruleConfig' => [
                'class' => 'app\components\AccessRule'
            ],
            'rules' => [
                [
                    'actions' => ['index', 'resource-type'],
                    'allow'=> true,
                    'roles' => ['admin'],
                ],
            ],
        ],
    ];
}

Если администратор определяется как auth_item, а пользователь находится в auth_item_assignments.

Ответ 4

Как я создал новую систему Rbac для yii2. вы можете направить разрешение на действие, и действие покажет, что вы не авторизованы для этого действия.

Таким образом вы обнаружите, что вы предоставите доступ только для действий, которые необходимо идентифицировать.

Я загрузил свою деталь здесь, вы можете найти много решений здесь.

Ответ 5

Это лучшее решение, с которым я мог столкнуться, когда сталкиваюсь с необходимостью фильтровать доступ с помощью разрешений, это назойливое, но может быть полезно, если вы пытаетесь создать роли в продуктивной среде и хотите использовать rbac.

use yii\web\ForbiddenHttpException;


if(Yii::$app->user->can('view-users')){
    return $this->render('view', [
        'model' => $this->findModel($id),
    ]);
}else{
    throw new ForbiddenHttpException('You dont have access to this site');
}