В этой статье мы завершаем рассмотрение RBAC в Yii 2 и посвятим её последней из его ключевых особенностей – наследованию ролей.
Наследование ролей во многом схоже с обычным наследованием классов. Роль наследник обладаем всеми свойствами (права, запреты) роли предка и добавляет к ним собственные.
Данная возможность особенно полезна в случаях когда в приложении имеется ряд ролей, которые в основном идентичны и различаются лишь незначительно за счёт некоторого сравнительно небольшого количества прав и разрешений.
Например. Есть три роли «Менеджер проекта 1», «Менеджер проекта 2», «Менеджер проекта 3». Каждая из них обладает всеми правами менеджера проекта, но с поправкой, что каждый менеджер видит только свой проект.
Выполнять каждый раз полное конфигурирование каждой подобной роли объёмная и рутинная работа. Гораздо проще и эффективнее создать базовую роль «Менеджер проекта» с общими правами для всех менеджеров проектов и уже от неё создавать наследников для конкретных проектов добавляя права на работу с этими проектами уже им.
Принцип создания такой системы ролей предельно прост. Нужно создать обе роли и назначить одну наследником другой при помощи метода addChild, как это показано в примере ниже.
1 2 3 |
$roleParent = Yii::$app->authManager->getRole($nameParent); $roleChild = Yii::$app->authManager->getRole($nameChild); Yii::$app->authManager->addChild($roleParent, $roleChild); |
Назначение прав ролям уже рассматривалось нами ранее и поэтом в примере оно опущено.
Таким образом, используя наследование можно очень гибко управлять правами доступа к приложению.
Стоит добавить, что наследование поддерживается не только для ролей, но и разрешений (реализуется аналогично). При чём разрешается не только наследовать роль от роли и разрешение от разрешения. Также допускается наследовать роль от разрешения и разрешение от роли.
Глубина наследования не ограничена.
Всё это позволяет при желании создавать гибкие и сложные механизмы управления доступом. Главное в процессе их разработки и эксплуатации самому в них не запутаться.
Добавить комментарий