@DarkByte2015

Как сделать защиту от несанкционированного редактирования?

Есть некоторый контроллер редактирования статей. Как мне сделать чтобы юзер не мог редактировать (и даже просматривать) чужие статьи? Причем я не хочу проверку писать в каждом методе. Их очень много. Мне надо как-то проверить до вызова экшэна имеет ли юзер доступ к статье или нет. Можно конечно проверять в beforeAction, вот только что проверять?? Например есть метод actionDeleteFile который удаляет файл статьи. Но я не передаю в него id статьи, ибо зачем? Этому методу достаточно знать id файла.

Так что сейчас у меня как-бы любой юзер может менять чужие статьи. Это не есть хорошо.

P.S. Единственным решением я вижу пока что прокидывать все-таки в каждый экшн даже там где это не требует id статьи, а в beforeAction выдернуть как-нибудь этот id из урла и если юзер не имеет права на редактирование - послать его на три буквы. :D
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
@DarkByte2015 Автор вопроса
Решил так

private function checkAccess($article_id) {
	$article = Article::findOne($article_id);
	$user = Yii::$app->user;

	if ($article->user_id !== $user->id && !$user->can('editor'))
		throw new ForbiddenHttpException("Вы не имеете доступа к этой статье!");
}


И в каждом экшэне его дергаю. Вспомнил что прокидывать article_id вовсе не обязательно, ведь почти у всех моделей есть прямой или косвенный доступ к нему. Даже у файлов можно получить дополнительном запросом по FK связи автора, а у него уже есть article_id. На этом варианте наверное и остановлюсь. Кажется ничего лучше придумать не удастся.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
У Вас есть некий индентификатор автора, допустим author_id
И есть экшен в котором запрашивается статья. Кто мешает добавить в условие
-andWhere(['author_id'=>Yii::$app->user->id])
Например:
public function actionView($id){
    if($model = Article::find()
                        ->andWhere(['author_id'=>Yii::$app->user->id])
                        ->andWhere(['id'=>$id])
                        ->one()){
       return $this->render('view',['model'=>$model])
    }
    throw new ForbiddenHttpExceptionn('Ты сюда не ходи, снег башка попадет');
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы