Контроль доступа к постам

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
mashinis
Сообщения: 24
Зарегистрирован: 2016.03.19, 15:17

Контроль доступа к постам

Сообщение mashinis » 2016.11.01, 13:40

Товарищи, приветствую.
Помогите советом, как реализовать подобную конструкцию.
Есть группа пользователей и одноименная группа постов, как организовать в коде проверку, чтоб юзер имел доступ только к постам из своей группы?

Аватара пользователя
yiijeka
Сообщения: 3068
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Контроль доступа к постам

Сообщение yiijeka » 2016.11.01, 13:53

http://www.yiiframework.com/doc-2.0/gui ... cess-check как тут для updateOwnPost.
Сделать у себя 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;
    }
}

mashinis
Сообщения: 24
Зарегистрирован: 2016.03.19, 15:17

Re: Контроль доступа к постам

Сообщение mashinis » 2016.11.01, 14:22

Спасибо за наводку. Буду пробовать

Аватара пользователя
samdark
Администратор
Сообщения: 9198
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Контроль доступа к постам

Сообщение samdark » 2016.11.01, 14:22

Я бы просто при выборке проверял:

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

public function actionView($id)
{
    $userGroupID = ... // тут получаем как-то группу текущего юзера
    $post = Post::find()->where(['id' => $id, 'group_id' => $userGroupID])->one();
    if (!$post) {
        // 404
    }
}

mashinis
Сообщения: 24
Зарегистрирован: 2016.03.19, 15:17

Re: Контроль доступа к постам

Сообщение mashinis » 2016.11.01, 14:55

Sam Dark писал(а):Я бы просто при выборке проверял
Я думал об этом. Так даже проще будет.

Сейчас разбираюсь с RBAC, вот и возник такой вопрос.

Mubat
Сообщения: 7
Зарегистрирован: 2016.08.14, 15:55

Re: Контроль доступа к постам

Сообщение Mubat » 2016.11.08, 16:19

Аналогичная проблема.
Если использовать пример mashinis, сделал так.
Создал два разрешения VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. И сделал чтобы первый был родителем для второго:

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

$authManager->addChild($VIEW_GROUP_ARTICLE, $VIEW_ALL_ARTICLE);
// у администратора есть все права автора (то есть и наследуется VIEW_GROUP_ARTICLE)
$authManager->addChild($admin, $author);
Назначил автору разрешение VIEW_GROUP_ARTICLE, а администратору - VIEW_ALL_ARTICLE.

В контроллере, в зависимости от разрешения, фильтрую список для вывода:

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

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() сработает только для автора. Но проверка получается не очень правильно ИМХО.
Может подскажите, как описать это лучше, чтобы в контроллере была одно условие для применения фильтрации?

Аватара пользователя
yiijeka
Сообщения: 3068
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Контроль доступа к постам

Сообщение yiijeka » 2016.11.08, 18:46

@Mubat
> у администратора и у автора присутсвуют обе роли
Какие "обе роли"?

Я выше описал код правила. Samdark привёл альтернативное. В чём проблема?

Mubat
Сообщения: 7
Зарегистрирован: 2016.08.14, 15:55

Re: Контроль доступа к постам

Сообщение Mubat » 2016.11.09, 11:35

@yiijeka,
> Какие "обе роли"?
VIEW_GROUP_ARTICLE и VIEW_ALL_ARTICLE. Это из-за наследования всех разрешений администратором от автора.

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

Loveorigami
Сообщения: 974
Зарегистрирован: 2014.08.27, 21:54

Re: Контроль доступа к постам

Сообщение Loveorigami » 2016.11.09, 13:03

Сделайте приоритет роли или иерархию. Очевтдно, что у юзера с правами админа и автора приоритетнее будет админ. Ему и показывайте.

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

//Это должно вернуть самую высокую роль, если админ наследует права автора
    /** @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;
    }
 

Ответить