Yii2, контроль доступа
25 июня 2013
В Yii 1.1 фильтр accessControl
был очень гибким:
// blacklist return array( array('deny', 'users' => array('*'), 'actions' => array('index'), ), ); //whitelist return array( array('allow', 'users' => array('*'), 'actions' => array('view'), ), array('deny'), );
Он позволял контролировать доступ как в стиле blacklist, так и whitelist. В Yii2 остался только whitelist. Это единственный нормальный и действительно безопасный подход в данной ситуации:
//whitelist public function behaviors() { return array( 'access' => array( 'class' => 'yii\web\AccessControl', 'rules' => array('allow' => true, 'users' => array('*'), 'actions' => array('view'), ), ), ); }
- https://github.com/yiisoft/yii2/issues/579.
- Basic principles of information protection, искать «b) Fail-safe defaults».
Комментарии RSS по email OK
Отлично) Иногда путался с правами доступа, когда нужно было сначало задать черный список, а потом уже белый. Чтобы в итоге добиться белый список доступа.
А бизнес правила сделаете callback? А не expression в виде строки, как реализовано сейчас в 1.1?
Sam, а почему было решено сделать фильтр доступа в виде поведения?
Костя, вроде уже сделали.
Евгений, просто чтобы убрать лишние сущности.
А user->isGuest так и остался? Это же по сути как раз черный список и довольно нехорошо.
name, в каком смысле?
Довольно таки спорное решение все таки. В практиках ИБ есть два диаметрально противоположных принципа: 1) Разрешено все, что не запрещено 2) Запрещено все, что не разрешено
У обоих принципов есть свои плюсы и минусы, а выделять и тем более делать дефолтным какой-то один не лучший вариант. Скажем мне нужно разрешить доступ всем, кроме одного, как в такой ситуации быть? Или deny все таки остается?
Дмитрий, в этом случае можно указать явно:
Sam, то есть deny все таки оставили. Я подумал грешным делом, что вы его вообще убрали и оставили только allow. Вопрос тогда еще такой, можно указать фильтры без allow или он все таки должен присутствовать?
Должен присутствовать. Это не то место, где нормально надеяться на значения по умолчанию.
Замечательно!
Sam, то есть в yii2 по умолчанию все запрещено? А в комментарии №8105 - пример, как в yii2 разрешить все и запретить одно действие?
Да.
Sam, проверка залогинености по user->isGuest противоречит принципу "по умолчанию все запрещено", потому что по умолчанию пользователь как раз должен быть гостем и ему должно даваться минимум прав. Однако довольно просто допустить ошибку, при которой isGuest будет возвращать false/NULL и это вызовет не совсем очевидное повышение пользователя в правах. Логичнее проверять права наоборот - т. е. что-то вроде user->isLoggedIn
@name При чем тут isGuest и "залогиненность"? Гостем может быть любой пользователь, которого разработчик сочтет гостем. Это настраивается. Если пользователь прошел процедуру аутентификации и авторизован, то это ещё далеко не значит что он тут НЕ "гость". Не нужно путать мух и котлет.
@name
Пример ошибки в студию пожалуйста.
идея правильная хотя бы со стороны трудозатратности - запрещать всегда приходится больше чем разрешать. но с другой стороны не очень гибкая, если говорить о реальных проектах в которых данные о пользователях и их правах хранятся в бд. Подобная структура могла бы быть еще хоть как-то юзабельна без допиливания если бы вместо пользователей фигурировали их роли.
WinterSilence, могут и роли фигурировать. RBAC никуда не делся.
Александр, доброго времени суток, на форуме обещали, что в системе будет нечто подобное модуля yii-rights. Когда ждать?
Андрей, скорее всего в релизе.
Александр, я так понял, что в папке vendor/yiisoft/yii2/rbac есть наработки по этому вопросу, но нет интерфейса для управления? Могли бы подсказать пример использования.
Андрей, в гайде он описан. Ещё гляньте юнит-тесты для RBAC.
Александр, спасибо за ответы
Александр, я так понял, что в rbac пользователь может быть прикреплен к нескольким ролям, и/или пермишенам. Как в таком случае пользователь будет иметь доступ к пермишенам, если в одной роли для данного пермишена доступ запрещен, а в другой разрешен? И какая роль будет в этом случае показана для пользователя?
Будет разрешён. Про «показано» не понял. Показано где?
как в yii закрыть доступ к jpg файлам из определённой папки для гостя
Константин, Yii тут не при чём. Это задача для вебсервера.