AuthorRule

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Limon
Сообщения: 74
Зарегистрирован: 2016.09.25, 11:50

AuthorRule

Сообщение Limon » 2016.11.01, 13:56

1.Хочу сделать так чтоб каждый мог редактировать только свои посты
2.но админ мог бы редактировать любой пост.

Вот мой код для решений первой задач

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

if(!Yii::$app->user->can(updateOwnPost, ['post' => $model->user_add])){
                throw new ForbiddenHttpException("Вы можете редактировать только свой публикаций", 1);
            } 
Как можно решить вторую проблему правильно?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AuthorRule

Сообщение zelenin » 2016.11.01, 14:39

добавить админу разрешение updatePost

Limon
Сообщения: 74
Зарегистрирован: 2016.09.25, 11:50

Re: AuthorRule

Сообщение Limon » 2016.11.01, 14:59

zelenin писал(а):добавить админу разрешение updatePost
Не помогло, или я что то не то делаю

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AuthorRule

Сообщение zelenin » 2016.11.01, 15:02

Limon писал(а):
zelenin писал(а):добавить админу разрешение updatePost
Не помогло, или я что то не то делаю
код покажите

Limon
Сообщения: 74
Зарегистрирован: 2016.09.25, 11:50

Re: AuthorRule

Сообщение Limon » 2016.11.01, 22:09

zelenin писал(а):
Limon писал(а):
zelenin писал(а):добавить админу разрешение updatePost
Не помогло, или я что то не то делаю
код покажите
я через rbac попытался это сделать

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AuthorRule

Сообщение zelenin » 2016.11.01, 22:13

Limon писал(а):
zelenin писал(а):
Limon писал(а): Не помогло, или я что то не то делаю
код покажите
я через rbac попытался это сделать
и?

Аватара пользователя
Alexum
Сообщения: 674
Зарегистрирован: 2016.09.26, 10:00

Re: AuthorRule

Сообщение Alexum » 2016.11.03, 12:01

Как вариант:

Например, если в новости автор привязан по $model->author_id, то можно сравнить его и id текущего пользователя. Одновременно с этим проверяем, не является ли он админом. Правда из админки такое поведение уже не будет настраиваться.

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

if ($model->author_id !== Yii::$app->user->id && !Yii::$app->user->can('admin')){
       throw new ForbiddenHttpException("Вы можете редактировать только свой публикации", 1);
}

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: AuthorRule

Сообщение za4me » 2016.11.04, 19:45

ТС, напомните мне завтра в ЛС тут или в telegram @za4me что-бы я не забыл написать сюда пример.
Поделюсь рабочим решением которое у меня в данный момент реализовано.

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

Re: AuthorRule

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

Нужно создать 2 разрешения:
1) updateOwnPost - для автора, в нём должно быть правило, которое проверяет автора статьи.
2) updatePost - для администратора, здесь никаких правил нет.

Создаем правило:
use yii\rbac\Item;
use yii\rbac\Rule;

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

class IsAuthorRule extends Rule
{
    public $name = 'isAuthor';

    /** default generated */
    public function execute($user, $item, $params)
    {
        return isset($params['authorId']) ? $params['authorId'] == $user : false;
    }
}
Далее, в контроллере RBAC пишем:

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

// создаем разрешение updateOwnPost, к которому включаем правило isAuthor, и updatePost:
$isAuthorRule = new IsAuthorRule;
$authManager->add($isAuthorRule);

$updateOwnPost = $authManager->createPermission('updateOwnPost');
$updateOwnPost->description = 'Изменение объекта где создатель как текущий автор указан'; //TODO change Yodd style
$updateOwnPost->ruleName = $isAuthorRule->name;
$authManager->add($updateOwnPost);

$updatePost = $authManager->createPermission('updateAnyPosts');
$updatePost->description = 'Изменение любого объекта';
$authManager->add($updatePost);

// Указываем, что $updatePost является частным случаем $updateOwnPost
$authManager->addChild($updateOwnPost, $updatePost);

// Теперь создаем роли:
$user = $authManager->createRole('author');
$user->name = 'author';
$user->description = 'Автор статей';

$admin = $authManager->createRole('admin');
$admin->name = 'admin';
$admin->description = 'Администратор';
$authManager->add($admin);

// Назначаем права пользователям
$authManager->addChild($user, $updateOwnPost);
$authManager->addChild($admin, $updatePost);

// Указываем, что администратор может всё что и пользователь:
$authManager->addChild($admin, $user);
Второй этап - проверка разрешений. Делаем проверку в экшине контроллера:

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

public function actionUpdate($id)
{
        $model = $this->findModel($id);
        if (!Yii::$app->user->can('updateAnyPosts', ['authorId' => $model->author_id])) {
            throw new ForbiddenHttpException(Yii::t('error',
                'You are not authorized to change the current record. You probably not an own'));
        }

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }
}
Если авторизоваться под Автором то произойдет следующее:
  • проверяется, есть ли у Автора разрешение 'updateAnyPosts' - если есть, то продолжится выполнения функции, если нет - следующий шаг;
  • проверяется, есть ли у Автора разрешение 'updateOwnPost' - если есть и правило 'isAuthor' возвращает true, то продолжится выполнения функции, если нет - throw exception

Ответить