<rmcreative>

RSS

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'),
      ),
    ),
  );
}

Комментарии RSS

  1. №8099
    Костя
    Костя 25.06.2013, 13:09:03

    Отлично) Иногда путался с правами доступа, когда нужно было сначало задать черный список, а потом уже белый. Чтобы в итоге добиться белый список доступа.

    А бизнес правила сделаете callback? А не expression в виде строки, как реализовано сейчас в 1.1?

  2. №8100
    Евгений
    Евгений 25.06.2013, 13:11:01

    Sam, а почему было решено сделать фильтр доступа в виде поведения?

  3. №8101
    Sam
    Sam 25.06.2013, 13:16:30

    Костя, вроде уже сделали.

    Евгений, просто чтобы убрать лишние сущности.

  4. №8102
    name
    name 25.06.2013, 13:47:44

    А user->isGuest так и остался? Это же по сути как раз черный список и довольно нехорошо.

  5. №8103
    Sam
    Sam 25.06.2013, 14:00:32

    name, в каком смысле?

  6. №8104
    Дмитрий
    Дмитрий 25.06.2013, 14:20:46

    Довольно таки спорное решение все таки. В практиках ИБ есть два диаметрально противоположных принципа: 1) Разрешено все, что не запрещено 2) Запрещено все, что не разрешено

    У обоих принципов есть свои плюсы и минусы, а выделять и тем более делать дефолтным какой-то один не лучший вариант. Скажем мне нужно разрешить доступ всем, кроме одного, как в такой ситуации быть? Или deny все таки остается?

  7. №8105
    Sam
    Sam 25.06.2013, 15:01:42

    Дмитрий, в этом случае можно указать явно:

    return array(
      array('deny',
        'users' => array('mybanneduser'),
        'actions' => array('*'),
      ),
      array('allow'),
    );
  8. №8106
    Дмитрий
    Дмитрий 25.06.2013, 15:49:44

    Sam, то есть deny все таки оставили. Я подумал грешным делом, что вы его вообще убрали и оставили только allow. Вопрос тогда еще такой, можно указать фильтры без allow или он все таки должен присутствовать?

  9. №8107
    Sam
    Sam 25.06.2013, 16:00:41

    Должен присутствовать. Это не то место, где нормально надеяться на значения по умолчанию.

  10. №8108
    Bohdan Vorona
    Bohdan Vorona 25.06.2013, 19:10:55

    Замечательно!

  11. №8113
    rmrevin
    rmrevin 28.06.2013, 16:03:08

    Sam, то есть в yii2 по умолчанию все запрещено? А в комментарии №8105 - пример, как в yii2 разрешить все и запретить одно действие?

  12. №8114
    Sam
    Sam 28.06.2013, 17:30:41

    Да.

  13. №8118
    name
    name 01.07.2013, 7:16:16

    Sam, проверка залогинености по user->isGuest противоречит принципу "по умолчанию все запрещено", потому что по умолчанию пользователь как раз должен быть гостем и ему должно даваться минимум прав. Однако довольно просто допустить ошибку, при которой isGuest будет возвращать false/NULL и это вызовет не совсем очевидное повышение пользователя в правах. Логичнее проверять права наоборот - т. е. что-то вроде user->isLoggedIn

  14. №8119
    Александр Кочетов
    Александр Кочетов 01.07.2013, 21:34:20

    @name При чем тут isGuest и "залогиненность"? Гостем может быть любой пользователь, которого разработчик сочтет гостем. Это настраивается. Если пользователь прошел процедуру аутентификации и авторизован, то это ещё далеко не значит что он тут НЕ "гость". Не нужно путать мух и котлет.

  15. №8120
    Александр Кочетов
    Александр Кочетов 01.07.2013, 21:35:46

    @name

    Однако довольно просто допустить ошибку, при которой isGuest будет возвращать false/NULL

    Пример ошибки в студию пожалуйста.

  16. №8183
    WinterSilence
    WinterSilence 21.07.2013, 5:51:30

    идея правильная хотя бы со стороны трудозатратности - запрещать всегда приходится больше чем разрешать. но с другой стороны не очень гибкая, если говорить о реальных проектах в которых данные о пользователях и их правах хранятся в бд. Подобная структура могла бы быть еще хоть как-то юзабельна без допиливания если бы вместо пользователей фигурировали их роли.

  17. №8184
    Sam
    Sam 21.07.2013, 11:31:51

    WinterSilence, могут и роли фигурировать. RBAC никуда не делся.

  18. №8950
    Андрей
    Андрей 09.04.2014, 19:05:21

    Александр, доброго времени суток, на форуме обещали, что в системе будет нечто подобное модуля yii-rights. Когда ждать?

  19. №8952
    Sam
    Sam 10.04.2014, 11:46:54

    Андрей, скорее всего в релизе.

  20. №8954
    Андрей
    Андрей 11.04.2014, 11:24:06

    Александр, я так понял, что в папке vendor/yiisoft/yii2/rbac есть наработки по этому вопросу, но нет интерфейса для управления? Могли бы подсказать пример использования.

  21. №8955
    Sam
    Sam 11.04.2014, 21:41:27

    Андрей, в гайде он описан. Ещё гляньте юнит-тесты для RBAC.

  22. №8966
    Андрей
    Андрей 15.04.2014, 14:06:31

    Александр, спасибо за ответы

  23. №9587
    Сергей
    Сергей 23.01.2015, 17:44:18

    Александр, я так понял, что в rbac пользователь может быть прикреплен к нескольким ролям, и/или пермишенам. Как в таком случае пользователь будет иметь доступ к пермишенам, если в одной роли для данного пермишена доступ запрещен, а в другой разрешен? И какая роль будет в этом случае показана для пользователя?

  24. №9589
    Sam
    Sam 24.01.2015, 19:52:38

    Будет разрешён. Про «показано» не понял. Показано где?

  25. №10433
    Константин
    Константин 04.04.2016, 14:53:55

    как в yii закрыть доступ к jpg файлам из определённой папки для гостя

  26. №10436
    Sam
    Sam 05.04.2016, 23:29:25

    Константин, Yii тут не при чём. Это задача для вебсервера.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.