Сомнения в отношении 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');
}