Контроль доступа к постам
Контроль доступа к постам
Товарищи, приветствую.
Помогите советом, как реализовать подобную конструкцию.
Есть группа пользователей и одноименная группа постов, как организовать в коде проверку, чтоб юзер имел доступ только к постам из своей группы?
Помогите советом, как реализовать подобную конструкцию.
Есть группа пользователей и одноименная группа постов, как организовать в коде проверку, чтоб юзер имел доступ только к постам из своей группы?
Re: Контроль доступа к постам
http://www.yiiframework.com/doc-2.0/gui ... cess-check как тут для updateOwnPost.
Сделать у себя readGroupPost c rule:
Сделать у себя readGroupPost c rule:
Код: Выделить всё
namespace app\rbac;
use yii\rbac\Rule;
/**
* Checks if authorID matches user passed via params
*/
class GroupRule extends Rule
{
public $name = 'isGroup';
/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
return isset($params['post']) ? $params['post']->group_name === $user->group_name : false;
}
}
Re: Контроль доступа к постам
Спасибо за наводку. Буду пробовать
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Контроль доступа к постам
Я бы просто при выборке проверял:
Код: Выделить всё
public function actionView($id)
{
$userGroupID = ... // тут получаем как-то группу текущего юзера
$post = Post::find()->where(['id' => $id, 'group_id' => $userGroupID])->one();
if (!$post) {
// 404
}
}
Нравится Yii? Давайте сделаем его лучше!.
Re: Контроль доступа к постам
Я думал об этом. Так даже проще будет.Sam Dark писал(а):Я бы просто при выборке проверял
Сейчас разбираюсь с RBAC, вот и возник такой вопрос.
Re: Контроль доступа к постам
Аналогичная проблема.
Если использовать пример mashinis, сделал так.
Создал два разрешения VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. И сделал чтобы первый был родителем для второго:
Назначил автору разрешение VIEW_GROUP_ARTICLE, а администратору - VIEW_ALL_ARTICLE.
В контроллере, в зависимости от разрешения, фильтрую список для вывода:
Но проблема в том, что фильтр и у администратора и у автора присутсвуют обе роли (я так понял, из-за наследования разрешений).
Если убрать наследование ролей [addChild()], то код сработает как надо - фильтр byGroup() сработает только для автора. Но проверка получается не очень правильно ИМХО.
Может подскажите, как описать это лучше, чтобы в контроллере была одно условие для применения фильтрации?
Если использовать пример mashinis, сделал так.
Создал два разрешения VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. И сделал чтобы первый был родителем для второго:
Код: Выделить всё
$authManager->addChild($VIEW_GROUP_ARTICLE, $VIEW_ALL_ARTICLE);
// у администратора есть все права автора (то есть и наследуется VIEW_GROUP_ARTICLE)
$authManager->addChild($admin, $author);
В контроллере, в зависимости от разрешения, фильтрую список для вывода:
Код: Выделить всё
public function actionIndex()
{
$searchModel = new UserSearch();
if (Yii::$app->user->can(VIEW_GROUP_ARTICLE) && !Yii::$app->user->can(VIEW_ALL_ARTICLE)) {
$searchModel->byGroup();
} elseif (!Yii::$app->user->can(VIEW_ALL_ARTICLE)) {
throw new ForbiddenHttpException();
}
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
Если убрать наследование ролей [addChild()], то код сработает как надо - фильтр byGroup() сработает только для автора. Но проверка получается не очень правильно ИМХО.
Может подскажите, как описать это лучше, чтобы в контроллере была одно условие для применения фильтрации?
Re: Контроль доступа к постам
@Mubat
> у администратора и у автора присутсвуют обе роли
Какие "обе роли"?
Я выше описал код правила. Samdark привёл альтернативное. В чём проблема?
> у администратора и у автора присутсвуют обе роли
Какие "обе роли"?
Я выше описал код правила. Samdark привёл альтернативное. В чём проблема?
Re: Контроль доступа к постам
@yiijeka,
> Какие "обе роли"?
VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. Это из-за наследования всех разрешений администратором от автора.
В Вашем примере присутствуют группы. А у нас этого нет, и ради уменьшения кода увеличивать количество столбцов в базе не хотелось бы
> Какие "обе роли"?
VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. Это из-за наследования всех разрешений администратором от автора.
В Вашем примере присутствуют группы. А у нас этого нет, и ради уменьшения кода увеличивать количество столбцов в базе не хотелось бы
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: Контроль доступа к постам
Сделайте приоритет роли или иерархию. Очевтдно, что у юзера с правами админа и автора приоритетнее будет админ. Ему и показывайте.
Код: Выделить всё
//Это должно вернуть самую высокую роль, если админ наследует права автора
/** @return string default role */
protected function getRole()
{
if (!$this->_role) {
$roles = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
$this->_role = key($roles);
}
return $this->_role;
}