Групповая политика в приложении отличается от традиционного контроля доступа на основе ролей (RBAC) доступной “из коробки” в фреймворке Yii2 только разделением разрешений (permissions) на два вида:
Для того, чтобы отделить маршруты от обычных разрешений, система парсит поле name разрешения на предмет выявления следующего шаблона:
{app_id}:/{module_id}/{controller_id}/{action_id}
Если разрешение не удовлетворяет следующему шаблону, оно расценивается как “традиционное” разрешение.
Вместо action_id может быть указан символ * (звездочка), что будет предоставлять доступ ко всем экшенам указанного контроллера. Например:
{app_id}:/{module_id}/{controller_id}/*{app_id}:/{controller_id}/*В качестве controller_id также можно указывать символ * (звездочка), что будет предоставлять доступ ко всем контроллерам и экшенам указанного модуля либо, если не указан модуль, то приложения. Например:
{app_id}:/{module_id}/*{app_id}:/*Если вместо controller_id указан символ * (звездочка), не стоит указывать /{action_id} после него. Тоже самое касается и module_id. Если вместо module_id указан символ * (звездочка), не стоит указывать /{controller_id}/{action_id} после него. Например, следующие записи не будут расценены как маршруты:
- {app_id}:/{module_id}/*/{action_id}
- {app_id}:/*/{controller_id}/{action_id}
- {app_id}:/*/*/{action_id}
У каждой роли есть свой вес, который задает иерархию ролей. Если роль пользователя имеет доступ в раздел “Список пользователей” (/users/user/manage), то такой роли не будут видны пользователи с весом роли >= текущего веса роли пользователя. Это означает, что и другим пользователям текущий пользователь не сможет назначить роль с весом >= своего.
Обратите внимание на то, что вес роли задается в поле data в виде сериализованного массива с помощью метода serialize с ключем weight. Например:
class m181213_115448_update_permission extends Migration{/*** {@inheritdoc}*/public function safeUp(){$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 200])], ['name' => 'Developer']);$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 100])], ['name' => 'Admin']);$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 20])], ['name' => 'Moderator']);$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 10])], ['name' => 'Operator']);$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 5])], ['name' => 'User']);$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 0])], ['name' => 'Guest']);}/*** {@inheritdoc}*/public function safeDown(){$this->update('{{%auth_item}}', ['data' => null], ['name' => ['Developer', 'Admin', 'Moderator', 'Operator', 'User', 'Guest']]);}}
Изменение групповой политики производится только с помощью миграций. Например:
class m181109_170606_update_permission extends Migration{/*** {@inheritdoc}*/public function safeUp(){$this->insert('{{%auth_item}}', ['name' => 'backend:/content/post/*','type' => Item::TYPE_PERMISSION]);$this->insert('{{%auth_item}}', ['name' => 'backend:/content/category/*','type' => Item::TYPE_PERMISSION]);$this->insert('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/post/*']);$this->insert('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/category/*']);$this->insert('{{%auth_item}}', ['name' => 'backend:/content/block/*','type' => Item::TYPE_PERMISSION]);$this->insert('{{%auth_item}}', ['name' => 'content.blockFullUpdate','type' => Item::TYPE_PERMISSION]);$this->insert('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/block/*']);$this->insert('{{%auth_item_child}}', ['parent' => 'Developer','child' => 'content.blockFullUpdate']);}/*** {@inheritdoc}*/public function safeDown(){$this->delete('{{%auth_item_child}}', ['parent' => 'Developer','child' => 'content.blockFullUpdate']);$this->delete('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/block/*']);$this->delete('{{%auth_item}}', ['name' => 'content.blockFullUpdate','type' => Item::TYPE_PERMISSION]);$this->delete('{{%auth_item}}', ['name' => 'backend:/content/block/*','type' => Item::TYPE_PERMISSION]);$this->delete('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/category/*']);$this->delete('{{%auth_item_child}}', ['parent' => 'Admin','child' => 'backend:/content/post/*']);$this->delete('{{%auth_item}}', ['name' => 'backend:/content/category/*','type' => Item::TYPE_PERMISSION]);$this->delete('{{%auth_item}}', ['name' => 'backend:/content/post/*','type' => Item::TYPE_PERMISSION]);}}
Не забывайте реализовывать метод down или safeDown миграции.
В случае изменения групповой политики в приложении нельзя изменять ранее примененную миграцию. Для внесения изменений в структуру базы данных необходимо создать новую миграцию.
| Роль | Наименование роли | Описание | Вес |
|---|---|---|---|
| Developer | Разработчик | Роль имеет полный доступ. Не рекомендуется предоставлять клиенту. При установке системы создается один пользователь с ролью “Разработчик”:
После сдачи проекта клиенту желательно удалить аккаунт Разработчика. |
200 |
| Admin | Администратор | Роль предназначена для клиентского аккаунта, имеет доступ практически во все разделы, за исключением разделов для разработчика (например, не предоставляется доступ к “Типы контента” в модуле “Контент”, “Модули” и т.д). | 100 |
| Moderator | Модератор | Имеет доступ к модулю “Контент”, “Тикеты”. | 20 |
| User | Пользователь | Присваивается зарегистрированному пользователю. | 5 |
| Guest | Гость | Роль, которая присваивается всем пользователям без исключения (указана в defaultRoles). | 0 |
В зависимости от задач и архитектуры разрабатываемого приложения может потребоваться изменить стандартную авторизацию. Ниже рассмотрены примеры, которые помогут вам сориентироваться в решении нетривиальных задач.
При регистрации пользователю назначается роль по умолчанию, которая задается в common\modules\users\businness\UserCreator.
В некоторых решениях требуется отключить регистрацию и сброс пароля для пользователей и оставить только регистрацию новых пользователей через Панель управления. Для этого необходимо отключить необходимые экшены (actions) в контроллере. common\modules\users\controllers\backend\DefaultController в методе actions().
public function actions(){return ['logout' => ['class' => 'common\modules\users\actions\LogoutAction','redirectUrl' => '@public'],'captcha' => ['class' => 'yii\captcha\CaptchaAction','foreColor' => 0x79C137],'login-lock-reset' => ['class' => 'common\modules\users\actions\LoginLockResetAction'],'register' => ['class' => 'common\modules\users\actions\RegisterAction'],'login' => ['class' => 'common\modules\users\actions\LoginAction'],'email-accept' => ['class' => 'common\modules\users\actions\EmailAcceptAction'],'request-password-reset' => ['class' => 'common\modules\users\actions\RequestPasswordResetAction'],'reset-password' => ['class' => 'common\modules\users\actions\ResetPasswordAction'],'resend-email-accept' => ['class' => 'common\modules\users\actions\ResendEmailAcceptAction']];}
Помимо этого необходимо скрыть ссылки из представления common/modules/users/views/default/login.php и других, в которых встречаются ссылки на вышеупомянутые экшны за исключением reset-password. Ссылка на этот экшн формируется в ходе отправки письма после отправки формы на странице запроса на восстановления пароля (request-password-reset).
В платформе TaskOn предусмотрен функционал сброса пароля по двум бизнес-процессам:
Подробное описание бизнес-процессов приведено в Руководстве пользователя в разделе “Регистрация пользователей”.
По умолчанию в платформе активирован первый способ восстановления пароля.
Для изменения конфигурации нужно изменить класс для действия (action) reset-password c common\modules\users\actions\ChangePasswordAction на common\modules\users\actions\ResetPasswordAction
контроллера common\modules\users\controllers\backend\DefaultController.
Для того, чтобы мы смогли Вам предоставить доступ расскажите немного о себе
Опишите в форме ниже задачу, которую требуется реализовать.